Oracle 中的 rownum sql 分组依据
rownum in Oracle sql with group by
我需要构建一个查询来按成员和到期日期检索信息组,但我需要每个成员都有一个序列号..
例如:
如果成员"A"有3条记录要过期,"B"只有1条而"C"有2条,我需要这样的结果:
Number 成员 ExpDate
1 个 2020 年 1 月 1 日
2 一个 2020 年 2 月 1 日
3 一个 2020 年 3 月 1 日
1 B 2020 年 1 月 1 日
1 C 2020 年 1 月 1 日
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;
但是我不能'"group"序列号....现在的结果是:
顺序记忆点日期
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
我认为您需要一个 DENSE_RANK window 函数。试试这个 -
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;
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
此 select return 第一列序列号
我需要构建一个查询来按成员和到期日期检索信息组,但我需要每个成员都有一个序列号..
例如:
如果成员"A"有3条记录要过期,"B"只有1条而"C"有2条,我需要这样的结果:
Number 成员 ExpDate 1 个 2020 年 1 月 1 日 2 一个 2020 年 2 月 1 日 3 一个 2020 年 3 月 1 日 1 B 2020 年 1 月 1 日 1 C 2020 年 1 月 1 日 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;
但是我不能'"group"序列号....现在的结果是:
顺序记忆点日期 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
我认为您需要一个 DENSE_RANK window 函数。试试这个 -
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;
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
此 select return 第一列序列号