2016-11-12 29 views
0

假設我有如下表HASCOSQL選擇所有ID與最大值,然後看看有多少行與每個ID相關聯

Table HASCO 

+--------+------+-----+ 
|PID  |Amount|Date | 
+--------+------+-----+ 
|1  |1000 |Date1| 
+--------+------+-----+ 
|1  |8000 |Date2| 
+--------+------+-----+ 
|2  |8000 |Date3| 
+--------+------+-----+ 
|2  |3000 |Date4| 
+--------+------+-----+ 
|2  |4000 |Date5| 
+--------+------+-----+ 
|3  |4000 |Date6| 
+--------+------+-----+ 

我想要得到以下結果:

+--------+--------+ 
|PID  |numTours| 
+--------+--------+ 
|1  |2  | 
+--------+--------+ 
|2  |3  | 
+--------+--------+ 

PID 1和2都有最大值8000,那麼PID 1有2行,PID 2有3行。

我嘗試以下查詢:

SELECT HASCO.PID, COUNT(*) AS numTour 
FROM HASCO 
GROUP BY HASCO.PID 
HAVING HASCO.PID IN 
(
SELECT HASCO.PID 
FROM HASCO 
WHERE HASCO.AMOUNT = (SELECT MAX(HASCO.AMOUNT) FROM HASCO) 

這適用於DB2,但有沒有更好的方式來做到這一點?

回答

3

Having子句子查詢可以簡化爲

SELECT HASCO.PID, COUNT(*) AS numTour 
FROM HASCO 
GROUP BY HASCO.PID 
HAVING max(HASCO.AMOUNT) = (SELECT MAX(HASCO.AMOUNT) FROM HASCO) 

如果DB2支持窗口集合函數然後

Select PID,count(1) 
(
Select HASCO.PID, 
     Max(AMOUNT)Over() as Max_amount, 
     Max(AMOUNT) Over(Partition by PID) as Max_Pid_Amt 
From HASCO 
) A 
Where Max_amount = Max_Pid_Amt 
Group by PID 
0

溶液1

WITH MAXIVALUE(SELECT MAX(HASCO.AMOUNT) maxi FROM HASCO) 
SELECT f1.PID, COUNT(*) AS numTours 
FROM HASCO f1 
GROUP BY f1.PID 
HAVING max(f1.AMOUNT) = (SELECT maxi FROM MAXIVALUE) 
0

溶液2

with hasmaxi (
select distinct f1.pid from HASCO f1 
where exists 
(select 1 from HASCO f2 having max(f2.AMOUNT)=f1.AMOUNT) 
) 
SELECT f3.PID, COUNT(*) AS numTours 
FROM HASCO f3 inner join hasmaxi f4 on f3.PID=f4.f1.PID 
GROUP BY f3.PID 
0

溶液3

SELECT f3.PID, COUNT(*) AS numTours 
FROM HASCO f3 inner join 
       (
       select distinct f1.pid from HASCO f1 
       where exists 
       (select 1 from HASCO f2 having max(f2.AMOUNT)=f1.AMOUNT) 
       ) f4 on f3.PID=f4.f1.PID 
GROUP BY f3.PID 
相關問題