2015-12-17 10 views
6

sytuację:wybrać inny Max identyfikatory dla innego klienta

mamy miesięczne pliki, które są ładowane do naszej hurtowni danych, jednak zamiast zastąpić starych obciążeń, są one po prostu skompilowane na szczycie siebie. pliki są ładowane w ciągu kilku dni.

więc po uruchomieniu skryptu SQL, chcielibyśmy dostać zduplikowane rekordy, tak aby przeciwdziałać tym prowadzimy unii ciągu 10-20 „klientów” i wybranie Max (loadID) np

SELECT 
Customer 
column 2 
column 3 

FROM 
MyTable 

WHERE 
LOADID = (SELECT MAX (LOADID) FROM MyTable WHERE Customer= 'ASDA') 

UNION 


SELECT 
Customer 
column 2 
column 3 

FROM 
MyTable 

WHERE 
LOADID = (SELECT MAX (LOADID) FROM MyTable WHERE Customer= 'TESCO' 

Powyższy związek musiałby do zrobienia dla wielu klientów, więc myślałem, że musi być bardziej efektywny sposób.

Nie możemy używać wartości MAX (LoadID) w instrukcji SELECT, ponieważ możliwy scenariusz może pociągać za sobą następujące;

Poniedziałek: Asda, Tesco, Waitrose załadowany do DW (z LoadID jako 124)

Wtorek: Sainsburys załadowany DW (z LoadID jako 125)

Środa: Nowy Tesco załadowany DW (z LoadID jako 126)

więc chciałbym LoadID 124 Asda & Waitrose, 125 Sainsburys, & 126 Tesco

Odpowiedz

6

używać funkcji okien:

SELECT t.* 
FROM (SELECT t.*, MAX(LOADID) OVER (PARTITION BY Customer) as maxLOADID 
     FROM MyTable t 
    ) t 
WHERE LOADID = maxLOADID; 
+2

To !! mamy zwycięzcę! Dzięki Gordon. Tak więc zadałem 2 pytania i oba dotyczą "PARTYCJI PRZEZ", więc zgadnij, co będę czytać! – sam

0

Czy podzapytanie tabeli pochodnej spełni Twoje potrzeby?

select yourfields 
from yourtables join 
(select customer, max(loadID) maxLoadId 
from yourtables 
group by customer) derivedTable on derivedTable.customer = realTable.customer 
    and loadId = maxLoadId 
+0

Dzięki Dan, może to zadziałać, ale wygląda na bardziej wydajnego Gordona, więc polecam to persoanlly – sam

Powiązane problemy