2017-07-21 1 views
-2

Ich möchte einen bestimmten Wert aus dieser Tabelle finden; der letzte Wert für jeden ElEnd, die ist, hat ItemNumber 2:Finde den letzten Wert aus einer von 3 Zeilengruppen

ID | ID2 | Item1 | Item2 | Item3 | Element | ItemNum | ElStart | ElEnd 
=================================================================== 
1 | 1 | rock | n  | roll | r  | 1  | 23.212 | 23.222 
2 | 1 | rock | n  | roll | o  | 1  | 23.222 | 23.256 
3 | 1 | rock | n  | roll | c  | 1  | 23.256 | 23.277 
4 | 1 | rock | n  | roll | k  | 1  | 23.277 | 23.290 
5 | 1 | rock | n  | roll | n  | 2  | 23.290 | 23.321 
6 | 1 | rock | n  | roll | r  | 3  | 23.321 | 23.331 
7 | 1 | rock | n  | roll | o  | 3  | 23.331 | 23.434 
8 | 1 | rock | n  | roll | l  | 3  | 23.434 | 23.456 
9 | 1 | rock | n  | roll | l  | 3  | 23.456 | 23.567 
10 | 2 | a  | tiny | rock | a  | 1  | 23.567 | 23.678 
11 | 2 | a  | tiny | rock | t  | 2  | 23.678 | 23.789 
12 | 2 | a  | tiny | rock | i  | 2  | 23.789 | 23.890 
13 | 2 | a  | tiny | rock | n  | 2  | 23.890 | 23.901 
14 | 2 | a  | tiny | rock | y  | 2  | 23.901 | 24.123 
15 | 2 | a  | tiny | rock | r  | 3  | 24.123 | 24.234 
16 | 2 | a  | tiny | rock | o  | 3  | 24.234 | 24.345 
17 | 2 | a  | tiny | rock | c  | 3  | 24.345 | 24.456 
18 | 2 | a  | tiny | rock | k  | 3  | 24.456 | 24.567 

So im Fall dieses Beispiels Tisch, ich will 23.321 und 24.123 auszuwählen. Ich möchte später diese Werte in UPDATE verwenden, um sie in eine neue Spalte Item2ElementEnd zu kopieren.

Ich habe eine Reihe von Abfragen versucht, die subselect oder UNION verwenden, aber keine von ihnen war effizient - sie waren alle so langsam laufen, dass ich sie stoppen musste (meine Tabelle hat etwa 600.000 Einträge).

Dies ist eine Abfrage, die mir den falschen Wert (ELEND für ItemNum 3 statt 2) ergibt:

zu langsam
select ID2, Item2, max(ElEnd) 
from t1 
group by ID2; 

Dies ist ein Beispiel Abfrage, die nicht arbeiten, weil es lief WAY ​​(I musste abbrechen):

select Item2, ElStart, ElEnd 
from t1 
where ItemNum = "2" 
and ElStart = (select max(ElStart) from t1 as f where f.Item2 = t1.Item2); 

Wie kann ich das am effizientesten machen?

+0

Also alle anderen Spalten auf dieses spezifische Problem irrelevant sind? – Strawberry

+0

1) Pls definieren 'letzten Wert'. Ich vermute, aber eine Frage sollte keinen Raum zum Raten lassen. 2) Bitte beachten Sie, was Sie versucht haben. Atm Ihre Frage sieht eher aus wie eine "herauszufinden, was mein Problem ist und mir eine Kopie-Paste-Lösung" Art der Frage. – Shadow

+0

Wie es in meiner Frage heißt, versuche ich das letzte Vorkommen für jedes 'ElEnd' zu finden, das' ItemNum' 2 hat, also wären im Fall dieser Beispieldaten die Werte, die zurückgegeben würden, '23.321' und '24.123'. – rayne

Antwort

0

ich haben nun eine (überraschend einfache) Lösung, um diese Abfrage mit:

select ID, ID2, item2, max(ElEnd), ItemNum 
from t1 
WHERE ItemNum = 2 
group by ID2, ItemNum; 
Verwandte Themen