mysql - SQL - RANK() 与多个 WHERE 和 GROUP BY
问题描述
我有一个带有 userid 和 date_accessed 的表。(每个用户标识有多个日期,但每个用户标识的日期数量不同。)
数据如下所示:
userid | date_accessed
A. | 2019-01-01
B. | 2019-01-02
A. | 2019-01-03
A. | 2019-01-04
B. | 2019-01-04
数据库中还有很多其他列,但我没有使用它们,但基本上每个用户每天执行一个操作的每一行都有一行。
我想对表进行排序,使其按用户 ID 分区,每个用户 ID 的 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
日期范围(date_1 和 date_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 BY 上,但是如果没有 GROUP BY,查询就不会运行——我需要以某种方式嵌套我的 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
推荐阅读
- node.js - 根据出生日期的年龄计算
- webpack - 如何防止 Webpack 向浏览器控制台发送垃圾邮件?
- node.js - AWS Lambda 努力让 ListFunctions 工作
- python - 从 vtk 到 python 的数据
- c++ - C++ 构建器 StringGrid 中的着色单元格
- php - 使用 ajax 调用 blob 数据
- javascript - ruby on rails 中的 ajax 不发送数据
- unity3d - 为什么我的 FpsCharacter 蔑视地形统一?
- javascript - 在引导程序中动态添加选项卡在导航离开和返回后不显示选项卡窗格内容
- html - flex-box,保持第一行展开