SQL-具有多个WHERE和GROUP BY的RANK()



我有一个带有userid和date_accessed的表。(每个用户ID有多个日期,但每个用户ID的日期数不相同。(

数据如下:

userid | date_accessed
A.     | 2019-01-01
B.     | 2019-01-02
A.     | 2019-01-03
A.     | 2019-01-04
B.     | 2019-01-04

数据库中还有很多其他列,但我没有使用它们,但基本上每个列都有一行,每个用户每天执行一个操作。

我想对表进行排序,使其按userid进行分区,每个userid的date_accessed按时间顺序排列。

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天的时间段。相反,我的查询只是列出/排名每个用户ID的所有10天,尽管并非所有用户ID都应该为每个日期都有相应的条目。即,它看起来像这样:

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

等等

我想问题可能出在我的GROUP BYs上,但如果没有GROUP BYs,查询就无法运行——我需要以某种方式嵌套RANK((吗?

我做错了什么?

你试过ROW_NUMBER而不是RANK吗?GROUP BY的目的是什么?

试试这个:

;WITH a as
(SELECT 
userid,
date_accessed,
ROW_NUMBER() OVER ( PARTITION BY userid ORDER BY date_accessed ASC) AS rnk
FROM table
WHERE 
userid IN ( SELECT * FROM other_table )
AND date_accessed <= 'date_1'
AND date_accessed >= 'date_2'
)
SELECT userid, date_accessed, rnk
from a
GROUP BY userid, date_accessed

使用CTE,该CTE将返回为所需日期筛选的每个user_iddate_accessed的不同行,然后使用ROW_NUMBER()获得秩:

WITH cte AS (
SELECT DISTINCT userid, date_accessed
FROM table_1
WHERE date_accessed >= '2019-01-01' AND date_accessed <= '2019-01-10'
)
SELECT userid, date_accessed,
ROW_NUMBER() OVER (PARTITION BY userid ORDER BY date_accessed ASC) `rank`
FROM cte

查看简化的演示。

相关内容

  • 没有找到相关文章

最新更新