Oracle sql 中的 rownum 与 group by

LPS*_*LPS 2 oracle group-by date row-number

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

例如:

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

号码会员有效期
 1 A 01/01/2020
 2 A 02/01/2020
 3 A 03/01/2020
 1 乙 01/01/2020
 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;
Run Code Online (Sandbox Code Playgroud)

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

序列记忆点日期
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

Ank*_*pai 5

我认为你需要一个 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;
Run Code Online (Sandbox Code Playgroud)