Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL获取一组分组结果中每个组的最大值行_Sql_Oracle_Greatest N Per Group - Fatal编程技术网

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;