2016-11-12 17 views
0

と仮定I持ってテーブルHASCO以下:SQLは、各IDに関連付けられている行数カウント、最大値を持つすべてのIDを選択する

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

Table HASCO 

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

は、私は次の結果を取得したいです

PID1とPID2の両方が最大量8000を持つ場合、PID1は2行、PID2は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上で動作しますが、それを行うには良い方法はありますか? Having句で

答えて

3

サブクエリは

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

を簡略化することができ3210
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 
関連する問題