2017-11-29 3 views
1

Beispieldaten auf MAIN_TABLE:Zeilen auswählen mit minimalen Werten [col1] von Maximalwerten [col2] von id SQL Server

+-----+--------+-------+ 
| ID | HEIGHT | STOCK | 
+-----+--------+-------+ 
| ID1 | 180 | 680 | 
| ID1 | 170 | 680 | 
| ID1 | 130 | 360 | 
| ID2 | 250 | 420 | 
| ID2 | 190 | 420 | 
| ID2 |  70 | 120 | 
| ... | ... | ... | 
+-----+--------+-------+ 

brauche ich verschiedene ID Zeilen auszuwählen, die max STOCK mit der min Höhe haben.

Das gewünschte Ergebnis wäre:

+-----+--------+-------+ 
| ID | HEIGHT | STOCK | 
+-----+--------+-------+ 
| ID1 | 170 | 680 | 
| ID2 | 190 | 420 | 
| ... | ... | ... | 
+-----+--------+-------+ 

Query-Code, dass ich es erreichen bin mit:

WITH MAX_STOCK (ID, maxstock) as 
(
    select ID, max(STOCK) as maxstock 
    from MAIN_TABLE 
    group by ID 
), 
TABLE_STOCK (ID, HEIGHT, STOCK) AS 
(
    select a.ID, a.HEIGHT, a.STOCK 
    from MAIN_TABLE a join MAX_STOCK b 
    on a.ID= b.ID and a.STOCK = b.maxstock 
), 
MIN_HEIGHT (ID, minheight) as 
(
    select ID, min(HEIGHT) as minheight 
    from TABLE_STOCK 
    group by ID 
), 
TABLE_HEIGHT (ID, HEIGHT, STOCK) AS 
(
    select a.ID, a.HEIGHT, a.STOCK 
    from TABLE_STOCK a join MIN_HEIGHT b 
    on a.ID= b.ID and a.HEIGHT = b.minheight 
) 

Wenn ich wählen Sie eine beliebige Tabellen MAX_STOCK, TABLE_STOCK, MIN_HEIGHT,

ich habe Ergebnisse in 1-2 Sekunden Zeit.

Aber bei der Auswahl TABLE_HEIGHT, die mein gewünschtes Ergebnis,

Es wird die Ausführung 6min + auf Daten mit 600 Zeilen ohne Antwort wären

Wie soll ich schreibe diese Abfrage das Ergebnis in angemessener Zeit haben?

+0

wäre nicht die minimale Höhe für ID1 130 ?? –

+0

der Bestand muss zuerst maximal sein, um die minimale Höhe zu berechnen –

+0

versuche die Antwort ich postete –

Antwort

0

Ich denke, dass Sie Fensterfunktionen verwenden können, um dies zu erreichen. Versuchen Sie folgendes Beispiel.

create table #Main(
Id varchar(50), 
HEIGHT int, 
STOCK int 
) 

insert into #Main values('ID1',180,680),('ID1',170,680),('ID1',130,360),('ID2',250,420),('ID2',190,420),('ID2',70,120) 

select * from (
select *,dense_rank() over(partition by Id order by STOCK desc,HEIGHT asc) as sira 
from #Main 
) k 
where sira=1 
Verwandte Themen