Sql 获取每小时的最大行数

Sql 获取每小时的最大行数,sql,oracle,Sql,Oracle,我有下表: "ITEMS" "EXPIRY_DATE" 1 30-AUG-17 07.00.00.000000000 AM 1 30-AUG-17 07.15.22.706000000 AM 1 30-AUG-17 07.44.51.794000000 AM 1 30-AUG-17 08.57.11.426000000 AM 1 30-AUG-17 09.57.24.810000000 AM 1

我有下表:

"ITEMS"   "EXPIRY_DATE"
1         30-AUG-17 07.00.00.000000000 AM
1         30-AUG-17 07.15.22.706000000 AM
1         30-AUG-17 07.44.51.794000000 AM
1         30-AUG-17 08.57.11.426000000 AM
1         30-AUG-17 09.57.24.810000000 AM
1         31-AUG-17 06.57.34.236000000 AM
1         31-AUG-17 06.57.42.121000000 AM
1         31-AUG-17 07.57.48.978000000 AM
然后,我使用以下查询获取行数(每天每小时):

SELECT COUNT(*), EXTRACT(HOUR FROM EXPIRY_DATE), EXTRACT(DAY FROM EXPIRY_DATE)
FROM TABLE1 
GROUP BY EXTRACT(HOUR FROM EXPIRY_DATE), EXTRACT(DAY FROM EXPIRY_DATE)
ORDER BY EXTRACT(DAY FROM EXPIRY_DATE);
使用上述样本数据进行上述查询的结果为:

"COUNT(*)"  "EXTRACT(HOURFROMEXPIRY_DATE)"  "EXTRACT(DAYFROMEXPIRY_DATE)"
3   7   30
1   8   30
1   9   30
2   6   31
1   7   31
如何返回每天每小时的最大行数?我的意思是,我想要以下输出:

"COUNT(*)"  "MAX hour"  "DAY"
3   7   30
2   6   31
使用
RANK

SELECT
    t.cnt,
    t.hour,
    t.day
FROM
(
    SELECT
        COUNT(*) AS cnt,
        EXTRACT(HOUR FROM EXPIRY_DATE) AS hour,
        EXTRACT(DAY FROM EXPIRY_DATE) AS day,
        RANK() OVER (PARTITION BY EXTRACT(DAY FROM EXPIRY_DATE)
                     ORDER BY COUNT(*) DESC) rank
    FROM TABLE1 
    GROUP BY EXTRACT(HOUR FROM EXPIRY_DATE), EXTRACT(DAY FROM EXPIRY_DATE)
) t
WHERE t.rank = 1
ORDER BY t.day;
使用
RANK

SELECT
    t.cnt,
    t.hour,
    t.day
FROM
(
    SELECT
        COUNT(*) AS cnt,
        EXTRACT(HOUR FROM EXPIRY_DATE) AS hour,
        EXTRACT(DAY FROM EXPIRY_DATE) AS day,
        RANK() OVER (PARTITION BY EXTRACT(DAY FROM EXPIRY_DATE)
                     ORDER BY COUNT(*) DESC) rank
    FROM TABLE1 
    GROUP BY EXTRACT(HOUR FROM EXPIRY_DATE), EXTRACT(DAY FROM EXPIRY_DATE)
) t
WHERE t.rank = 1
ORDER BY t.day;

使用
HAVING

SELECT COUNT(*), EXTRACT(HOUR FROM EXPIRY_DATE) eh, EXTRACT(DAY FROM EXPIRY_DATE) ed
FROM TABLE1 
GROUP BY EXTRACT(HOUR FROM EXPIRY_DATE), EXTRACT(DAY FROM EXPIRY_DATE)
HAVING COUNT(*) >= ALL
(
    SELECT COUNT(*)
    FROM TABLE1 t2
    WHERE EXTRACT(DAY FROM t2.EXPIRY_DATE) = EXTRACT(DAY FROM table1.EXPIRY_DATE)
    GROUP BY EXTRACT(HOUR FROM t2.EXPIRY_DATE), 
)

使用
HAVING

SELECT COUNT(*), EXTRACT(HOUR FROM EXPIRY_DATE) eh, EXTRACT(DAY FROM EXPIRY_DATE) ed
FROM TABLE1 
GROUP BY EXTRACT(HOUR FROM EXPIRY_DATE), EXTRACT(DAY FROM EXPIRY_DATE)
HAVING COUNT(*) >= ALL
(
    SELECT COUNT(*)
    FROM TABLE1 t2
    WHERE EXTRACT(DAY FROM t2.EXPIRY_DATE) = EXTRACT(DAY FROM table1.EXPIRY_DATE)
    GROUP BY EXTRACT(HOUR FROM t2.EXPIRY_DATE), 
)

@你是MGCR7吗wellcome@MGCR7你很好