sql-rank(),具有多个where和group by

wljmcqd8  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(337)

我有一个带有用户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()吗?
我做错什么了?

ycl3bljg

ycl3bljg1#

使用一个cte,它将为每个cte返回不同的行 user_id 以及 date_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

请参阅简化的演示。

piv4azn7

piv4azn72#

你试过用排号代替排名吗?分组的目的是什么?
试试这个:

;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

相关问题