SQL选择具有最大值的所有id,然后计算与每个id关联的行数

SQL选择具有最大值的所有id,然后计算与每个id关联的行数,sql,db2,Sql,Db2,假设我有下表HASCO: Table HASCO +--------+------+-----+ |PID |Amount|Date | +--------+------+-----+ |1 |1000 |Date1| +--------+------+-----+ |1 |8000 |Date2| +--------+------+-----+ |2 |8000 |Date3| +--------+------+-----+ |2

假设我有下表HASCO:

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上有效,但是有更好的方法吗?

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

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
解决方案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)
解决方案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)
解决方案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
解决方案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
解决方案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
解决方案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