【问题标题】:rownum in Oracle sql with group byOracle sql中的rownum与group by
【发布时间】:2018-06-01 23:29:48
【问题描述】:

我需要构建一个查询来按成员和到期日期检索信息组,但我需要为每个成员提供一个序列号..

例如:

如果成员“A”有 3 条记录要过期,“B”只有 1 条,“C”有 2 条,我需要这样的结果:

编号会员有效期 1 A 2020 年 1 月 1 日 2 A 02/01/2020 3 A 03/01/2020 1 B 2020 年 1 月 1 日 1 C 01/01/2020 2 C 02/01/2020

我现在的查询是:

SELECT ROW_NUMBER() OVER(ORDER BY TRUNC(EXPIRATION_DT) ASC) AS SEQUENCE, MEMBER_ID AS MEMBER, SUM(ACCRUALED_VALUE) - SUM(USED_VALUE) AS POINTS, trunc(EXPIRATION_DT) AS EXPDATE
FROM TABLE1
WHERE EXPIRATION_DT > SYSDATE AND  EXPIRATION_DT < SYSDATE + 90
GROUP BY MEMBER_ID, TRUNC(EXPIRATION_DT)
HAVING SUM(ACCRUALED_VALUE) - SUM(USED_VALUE) > 0
ORDER BY 4 ASC;

但我不能“分组”序列号......现在的结果是:

Seq Mem 点 日期 1 1-O 188 2018-03-01 00:00:00 2 1-C 472 2018-03-01 00:00:00 3 1-A 485 2018-03-01 00:00:00 4 1-1 267 2018-03-01 00:00:00 5 1-E 500 2018-03-01 00:00:00 6 1-P 55 2018-03-01 00:00:00 7 1-E 14 2018-03-01 00:00:00

【问题讨论】:

  • 您能否解释一下,您的实际结果中的Mem 列是什么以及如何将其转换为“A”、“B”、“C”?
  • A、B 或 C 只是可能值的示例......

标签: oracle date group-by row-number


【解决方案1】:

我认为您需要一个 DENSE_RANK 窗口函数。试试这个 -

 SELECT DENSE_RANK() OVER (PARTITION BY MEMBER ORDER BY TRUNC(EXPIRATION_DT) ASC) AS SEQUENCE
       ,MEMBER_ID AS MEMBER
       ,SUM(ACCRUALED_VALUE) - SUM(USED_VALUE) AS POINTS
       ,trunc(EXPIRATION_DT) AS EXPDATE
FROM TABLE1
WHERE EXPIRATION_DT > SYSDATE AND  EXPIRATION_DT < SYSDATE + 90
GROUP BY MEMBER_ID
        ,TRUNC(EXPIRATION_DT)
HAVING SUM(ACCRUALED_VALUE) - SUM(USED_VALUE) > 0
ORDER BY 4 ASC;

【讨论】:

    【解决方案2】:
    with g as (
    select *
    From TABLE1 g
    group by MEMBER_ID
            ,TRUNC(EXPIRATION_DT)
    HAVING SUM(ACCRUALED_VALUE) - SUM(USED_VALUE) > 0   ---- etc
    ) 
    select rownum, g.* From g
    

    此选择返回具有序列号的第一列

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 2022-09-22
      • 2011-08-14
      • 2018-04-11
      • 2010-09-30
      • 2011-06-21
      • 2013-12-09
      相关资源
      最近更新 更多