Oracle SQL获取一组分组结果中每个组的最大值行
我有一组通过运行得到的结果Oracle SQL获取一组分组结果中每个组的最大值行,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我有一组通过运行得到的结果 SELECT REV_USAGE_DATA.DDATE, REV_USAGE_DATA.SEGMENT, COUNT(*) AS Freq FROM CADA_PERMSISDN_DASH REV_USAGE_DATA GROUP BY REV_USAGE_DATA.DDATE, REV_USAGE_DATA.SEGMENT ORDER BY REV_USAGE_DATA.DDATE
SELECT
REV_USAGE_DATA.DDATE,
REV_USAGE_DATA.SEGMENT,
COUNT(*) AS Freq
FROM CADA_PERMSISDN_DASH REV_USAGE_DATA
GROUP BY
REV_USAGE_DATA.DDATE,
REV_USAGE_DATA.SEGMENT
ORDER BY
REV_USAGE_DATA.DDATE
对于每个日期,我都希望得到FREQ列中具有最高值的整行。如何实现这一点?您可以使用CTE
WITH CTE0 AS
(
SELECT
REV_USAGE_DATA.DDATE,
REV_USAGE_DATA.SEGMENT,
COUNT(*) AS Freq
FROM CADA_PERMSISDN_DASH REV_USAGE_DATA
GROUP BY
REV_USAGE_DATA.DDATE,
REV_USAGE_DATA.SEGMENT
)
SELECT
DDATE,
SEGMENT,
FREQ
FROM CTE0
WHERE (DDATE, SEGMENT, FREQ) IN (
SELECT DDATE, MAX(SEGMENT), MAX(FREQ)
FROM CTE0
GROUP BY DDATE
)
使用行编号()
:
如果您在某个日期有联系,并且希望获得所有的最高值,那么请使用
RANK()
。大量类似的解决方案!这是我的。
使用CTE计算哪个记录具有最高频率(类似于行号),然后选择它们
WITH data AS
(
SELECT
REV_USAGE_DATA.DDATE,
REV_USAGE_DATA.SEGMENT,
COUNT(*) AS Freq
FROM CADA_PERMSISDN_DASH REV_USAGE_DATA
GROUP BY
REV_USAGE_DATA.DDATE,
REV_USAGE_DATA.SEGMENT
),
maxRecords AS
(
SELECT DDATE, SEGMENT, FREQ,
CASE WHEN FREQ = MAX(FREQ) OVER(PARTITION BY DDATE) THEN 1 ELSE 0 END HighestFreq
FROM data
)
SELECT DDATE, SEGMENT, FREQ
FROM maxRecords
WHERE HighestFreq = 1
ORDER BY DDATE;
谢谢,但这是给我4行每一个日期。事实上,它复制了我在问题中分享的相同结果集。@tendaitakas。是的。那就行了,不是吗?我添加了where子句,它可以实现您想要的过滤。工作起来很有魅力。非常感谢。
WITH data AS
(
SELECT
REV_USAGE_DATA.DDATE,
REV_USAGE_DATA.SEGMENT,
COUNT(*) AS Freq
FROM CADA_PERMSISDN_DASH REV_USAGE_DATA
GROUP BY
REV_USAGE_DATA.DDATE,
REV_USAGE_DATA.SEGMENT
),
maxRecords AS
(
SELECT DDATE, SEGMENT, FREQ,
CASE WHEN FREQ = MAX(FREQ) OVER(PARTITION BY DDATE) THEN 1 ELSE 0 END HighestFreq
FROM data
)
SELECT DDATE, SEGMENT, FREQ
FROM maxRecords
WHERE HighestFreq = 1
ORDER BY DDATE;