2017-06-09 9 views
0

Ich frage mich, wie ich die letzte Iteration eines Feldes in meinen Ergebnissen abfragen kann. Zum Beispiel schreibe ich eine Abfrage, die mir diese Liste von IDs zurückkehren würde:Wie kann ich nur die letzte Iteration abfragen?

132GBD00 
132GBD01 
59RTW900 
59RTW901 
59RTW902 
376BH200 
376BH201 
376BH202 
376BH203 
5789DD00 

ich die Abfrage möchte dieses Ergebnis zurück:

132GBD01 
59RTW902 
376BH203 
5789DD00 

Beachten Sie, dass die ähnlichen IDs abweichen nur in den letzten zwei Zeichen. 00 ist das Original und 01, 02, usw. kommt danach.

SELECT memid 
FROM MEMBERID 
WHERE MEMBERID = ??? 

Die Tabelle hat Termine, aber ich kann nicht von einem max(date) für verschiedene memid und Filter suchen, weil manchmal der letzte Wiederholung Zeitpunkt NULL ist: Wenn ich eine Abfrage wie schreiben. Ich versuche zu sehen, ob es möglich ist, eine Liste von IDs zu suchen und nach den letzten zwei Zeichen in der ID zu filtern, um zu sehen, welche größer ist und das zurückgeben.

+3

Dies ist ein Hinweis auf ein falsches Design. Sie drängen zwei Werte in ein einzelnes Tupel, das gegen 1NF verstößt und eine ernst zu nehmende PITA ist. Sie können hier ROW_NUMBER verwenden, aber Sie müssen nach einer Teilzeichenfolge partitionieren. –

+0

Wahrscheinlicher Tippfehler: 'VON MEMBERID' und' WHERE MEMBERID = ??? 'ist ziemlich seltsam. Ein Tabellenname an beiden Stellen? – HABO

Antwort

1

Anscheinend sind die letzten beiden Nummern Sequenznummern. Sie können die jüngsten mit einem group by erhalten:

select max(memid) as memid 
from members 
group by left(memid, len(memid) - 2); 

Wenn Sie anderen Spalten wollen, dann würden Sie row_number() stattdessen verwenden.

0

Versuchen Sie, diese

WITH cte AS (SELECT Memid 
        , ROW_NUMBER() OVER (PARTITION BY LEFT(Memid, LEN(Memid) - 2) ORDER BY memid DESC) AS Rownum 
      FROM MEMBERID 
) 
SELECT Memid 
FROM cte 
WHERE Rownum = 1; 
0

Sie wie unten verwenden row_number können:

Select top(1) with ties * from Members 
    Order by Row_Number() over (partition by SUBSTRING(memid, 1, len(memid)-2) order by convert(int,substring(memid, len(memid)-1, 2)) desc) 

Oder äußere Abfrage wie folgt:

Select MemId from (
    Select *, RowN = Row_Number() over (partition by SUBSTRING(memid, 1, len(memid)-2) order by convert(int,substring(memid, len(memid)-1, 2)) desc) 
    from Members 
) a Where a.RowN = 1 

Mit anderen Spalten als auch

0

I erstellt eine temp t Ihre Daten nutzen können. Hier ist ein ziemlich einfacher Weg, es zu tun:

CREATE TABLE #Values (
    SomeValue varchar(20) 
); 

INSERT INTO #Values 
SELECT '132GBD00'; 
INSERT INTO #Values 
SELECT '132GBD01'; 
INSERT INTO #Values 
SELECT '59RTW900'; 
INSERT INTO #Values 
SELECT '59RTW901'; 
INSERT INTO #Values 
SELECT '59RTW902'; 
INSERT INTO #Values 
SELECT '376BH200'; 
INSERT INTO #Values 
SELECT '376BH201'; 
INSERT INTO #Values 
SELECT '376BH202'; 
INSERT INTO #Values 
SELECT '376BH203'; 
INSERT INTO #Values 
SELECT '5789DD00'; 


SELECT DISTINCT 
    LAST_VALUE(SUBSTRING(SomeValue, 1, 6)) OVER (PARTITION BY SUBSTRING(SomeValue, 1, 6) ORDER BY SomeValue) AS LasID 
FROM #Values 
Verwandte Themen