我有一个带有用户ID和访问日期的表(每个用户标识有多个日期,但每个日期的日期数不同。)
数据如下所示:
userid | date_accessed
A. | 2019-01-01
B. | 2019-01-02
A. | 2019-01-03
A. | 2019-01-04
B. | 2019-01-04
db中也有很多其他的列,但我不使用它们,但基本上每个用户执行一个操作的每一天都有一行。
我想对表进行排序,以便按userid对其进行分区,每个userid的访问日期按时间顺序排列。
userid | date_accessed | rank
A. | 2019-01-01 | 1
A. | 2019-01-03 | 2
A. | 2019-01-04 | 3
B. | 2019-01-02 | 1
B. | 2019-01-04 | 2
我的问题是:
WITH a AS (
SELECT
userid
FROM table_1
WHERE
date_accessed <= '2019-01-01'
AND date_accessed >= '2019-01-10'
HAVING
COUNT(DISTINCT date_accessed) > 1
)
SELECT
userid,
date_accessed,
RANK() OVER (
PARTITION BY userid
ORDER BY date_accessed ASC)
FROM table_1
WHERE
userid IN (SELECT * FROM a)
AND date_accessed <= '2019-01-01'
AND date_accessed >= '2019-01-10'
GROUP BY userid, date_accessed
日期范围(日期1和日期2)包括10天。相反,我的查询只是列出每个userid的所有10天,尽管不是所有userid都应该为每个日期都有相应的条目。i、 e.看起来是这样的:
userid | date_accessed | rank
A. | 2019-01-01 | 1
A. | 2019-01-02 | 2
A. | 2019-01-03 | 3
A. | 2019-01-04 | 4
A. | 2019-01-05 | 5
...
A. | 2019-01-10 | 10
B. | 2019-01-01 | 1
B. | 2019-01-02 | 2
等等。
我想问题可能出在我的groupbys上,但是没有groupbys查询就不能运行-我需要嵌套rank()吗?
我做错什么了?
2条答案
按热度按时间ycl3bljg1#
使用一个cte,它将为每个cte返回不同的行
user_id
以及date_accessed
筛选出您想要的日期,然后使用ROW_NUMBER()
要获得排名:请参阅简化的演示。
piv4azn72#
你试过用排号代替排名吗?分组的目的是什么?
试试这个: