2009-07-06 17 views
1

Ich versuche, eine Abfrage zu schreiben, die nur die neuesten Ergebnisse zurückgibt. Die Tabelle, aus der ich Informationen entwerfe, hat keine eindeutigen Spalten und enthält Informationen über Tarifänderungen, so dass für jeden bestimmten Kunden mehrere Tarifänderungen möglich sind - ich möchte nur die letzte Tarifänderung für jeden Kunden.Wählen Sie die letzten Daten

Die Struktur ist:

mrmatter VARCHAR(14) 
mrtk VARCHAR(14) 
mreffdate DATETIME 
mrtitle VARCHAR(100) 
mrrate INT 
mrdevper INT 

Einige Beispieldaten sind:

mrmatter   mrtk  mreffdate     mrtitle mrrate mrdevper 
184-00111  0005  2001-03-19 00:00:00.000 !  250  NULL 
184-00111  0259  2001-03-19 00:00:00.000 !  220  NULL 
184-00111  9210  2001-03-19 00:00:00.000 !  220  NULL 
184-00111  0005  2007-07-01 00:00:00.000 !  NULL  NULL 

Aus den Daten über Sie dort sehen können, sind zwei mrtk (0005), aus diesen Ergebnissen sollte es nur drei Rück anstelle der vier Reihen.

Die Abfrage ist nicht nur auf MRTK, statt MRTK könnte es eine MRTITLE in diesem Fall würde ich das neueste Datum finden müssen, wenn es mehrere gibt.

Ich habe versucht, die folgende Abfrage, gibt die Ergebnisse in der neuesten zu ältesten sortiert, aber es gibt vier Zeilen (zwei 0005) statt nur die drei. Ich habe verschiedene Möglichkeiten ausprobiert, um die gleiche Abfrage auszuführen, aber es gibt alle die gleichen Ergebnisse zurück.

SELECT mrmatter,mrtk,mrrate,MAX(mreffdate) AS 'MostRecent' 
FROM mexrate 
WHERE mrmatter='184866-00111' 
GROUP BY mrmatter,mrtk,mrrate 

Jede Hilfe, die zur Verfügung gestellt werden kann, würde sehr geschätzt werden.

UPDATE: Die Spalte mrrate kann Nullen enthalten, und die Nullen können der letzte Eintrag sein. Was ich möchte, ist der neueste Eintrag für das gleiche mrmatter AND (mrtk OR mrtitle).

Einige weitere Beispieldaten ist:

mrmatter  mrtk    mrtk  mrrate mreffdate 
100626-01406 Senior Assoc ! 235.000 2006-01-25 00:00:00.000 
100626-01406 Solicitor ! 235.000 2006-01-25 00:00:00.000 
100626-01407 Associate   ! 265.000 2006-01-30 00:00:00.000 
100626-01407 Associate   ! 276.000 2007-07-01 00:00:00.000 
100626-01407 Partner   ! 265.000 2006-01-30 00:00:00.000 
100626-01407 Partner   ! 276.000 2007-07-01 00:00:00.000 
100626-01407 Senior Assoc ! 265.000 2006-01-30 00:00:00.000 
100626-01407 Senior Assoc ! 276.000 2007-07-01 00:00:00.000 

Matt

+0

Könnten Sie bitte eine CREATE TABLE und INSERT-Anweisungen bereitstellen. Das wäre viel einfacher. Und Sie sollten Code-Blöcke verwenden, wenn Sie Dinge wie SQL posten, also wird es hervorgehoben. –

Antwort

1

konnte ich erreichen, was ich war, nachdem sie durch diese Abfrage mit:

SELECT t1.mrmatter,t2.mrtk,t1.mrrate,t2.MostRecent 
FROM mexrate t1 
INNER JOIN 
(
    SELECT DISTINCT(mrtk),MAX(mreffdate) AS MostRecent 
    FROM mexrate 
    WHERE mrmatter='184866-00111'  
    GROUP BY mrtk 
) t2 ON t1.mrtk=t2.mrtk AND t1.mreffdate=t2.MostRecent 
WHERE mrmatter='184866-00111' 

Vielen Dank allen für Ihre Unterstützung bei diesem Problem ist es, wie immer , sehr geschätzt.

Matt

2

Die group by-Klausel als auch mrrate Spalte haben. Für die zwei Zeilen von mrtk (0005) haben die erste Zeile mrrate als 250 und die zweite Zeile mrrate als NULL. Dies wird sicherlich zu zwei Zeilen von 0005 führen.

Die Abfrage funktioniert einwandfrei. Sie können mrrate aus der Gruppe entfernen, aber es ist wahrscheinlich eine Funktion hinzugefügt, die nicht klar ist.

+0

Entfernen der Spalte "mrrate" aus der Gruppe durch Ergebnisse in: Die Spalte "mexrate.mrrate" ist in der Auswahlliste ungültig, da sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist. – Lima

0

versuchen Sie dies:

DECLARE @YourTable table 
(mrmatter VARCHAR(14) 
,mrtk VARCHAR(14) 
,mreffdate DATETIME 
,mrtitle VARCHAR(100) 
,mrrate INT 
,mrdevper INT 
) 

insert into @YourTable values('184-00111',  '0005'  , '2001-03-19 00:00:00.000' , '!' , 250 , NULL) 
insert into @YourTable values('184-00111',  '0259'  , '2001-03-19 00:00:00.000' , '!' , 220 , NULL) 
insert into @YourTable values('184-00111',  '9210'  , '2001-03-19 00:00:00.000' , '!' , 220 , NULL) 
insert into @YourTable values('184-00111',  '0005'  , '2007-07-01 00:00:00.000' , '!' , NULL , NULL) 

SELECT 
    mrmatter 
     ,mrtk 
     ,mreffdate 
     ,mrtitle 
     ,mrrate 
     ,mrdevper 
    FROM (SELECT 
       row_number() over(partition by mrtk order by mrtk,mreffdate DESC) AS RankValue,* 
       FROM @YourTable 
     ) dt 
    WHERE RankValue=1 

Ausgang:

mrmatter  mrtk   mreffdate    mrtitle mrrate  mrdevper 
-------------- -------------- ----------------------- -------- ----------- ----------- 
184-00111  0005   2007-07-01 00:00:00.000 !  NULL  NULL 
184-00111  0259   2001-03-19 00:00:00.000 !  220   NULL 
184-00111  9210   2001-03-19 00:00:00.000 !  220   NULL 

(3 row(s) affected) 

EDIT
Ich habe Ihre Frage noch einmal gelesen, und ich bin nicht 100% sicher für Ihre Gruppierung Anforderung, vielleicht weil die Beispieldaten etwas spärlich sind. Dies kann die Abfrage für Sie sein:

SELECT 
    mrmatter 
     ,mrtk 
     ,mreffdate 
     ,mrtitle 
     ,mrrate 
     ,mrdevper 
    FROM (SELECT 
       row_number() over(partition by mrmatter,mrtk,mrrate order by mrmatter,mrtk,mrrate,mreffdate DESC) AS RankValue,* 
       FROM @YourTable 
     ) dt 
    WHERE RankValue=1 

Es werden die gleichen vier Reihen wie Ihre Abfrage ergeben, weil Sie versuchen, mrrate in die Gruppe zu bringen, und 0005 hat zwei: 250 und NULL.Wenn Sie möchten, NULL Verwendung beseitigen:

SELECT 
    mrmatter 
     ,mrtk 
     ,mreffdate 
     ,mrtitle 
     ,mrrate 
     ,mrdevper 
    FROM (SELECT 
       row_number() over(partition by mrmatter,mrtk,mrrate order by mrmatter,mrtk,mrrate,mreffdate DESC) AS RankValue,* 
       FROM @YourTable 
       WHERE mrrate IS NOT NULL 
     ) dt 
    WHERE RankValue=1 
+0

Erstens, row_number ist für SQL 2000, also wird keiner von diesen funktionieren. Ich möchte auch nicht die NULL-Ergebnisse ausschließen, als ob die NULL-Ergebnisse das neueste Ergebnis für Mrmatter AND sind (mrtitle ODER mrtk), dann möchte ich es anzeigen. Danke, Matt – Lima

+0

http://www.google.com/search?hl=en&as_q=sql+server+2000+row_number&as_epq=&as_oq=&as_eq=&num=100&lr=&as_filetype=&ft=i&as_sitesearch=&as_qdr=all&as_rights = & as_occt = beliebige & cr = & as_nlo = & as_nhi = & safe = Bilder –

Verwandte Themen