sql - 计算相对于当前行按天分组的每一行的先前登录
问题描述
目标:我想收集按天分组的每个用户的登录信息。
问题:我正在努力计算最后一列的函数,该函数是相对于登录列的当前行的最后一次登录(有点像滞后函数,但不知道如何使用它)。问题是我只需要显示过去三个月的登录信息,那么如果我在过去三个月设置 where 条件,它将如何计算下表中 days_last_login 列的第五次观察?:
期望的输出:
+----+---------------------+-----------------+
| id | login | days_last_login |
+----+---------------------+-----------------+
| 1 | 2018-12-10 05:00:00 | 5 |
| 1 | 2018-12-07 05:30:00 | 3 |
| 1 | 2018-12-01 05:30:00 | 6 |
| 2 | 2019-08-01 05:30:00 | 7 |
| 2 | 2019-01-01 05:30:00 | 365 |
+----+---------------------+-----------------+
当前查询:
SELECT id
,YEAR(login) as yr, MONTH(login) as mm, DAY(login) as dd
,CAST(login AS DATE) as logins
,FUNCTION FOR DAYS_LAST_LOGIN
FROM database.table
WHERE login > DATEADD(month,-3,getdate())
GROUP BY YEAR(login), MONTH(login), DAY(login), id
ORDER BY id, yr desc, mm desc, dd desc
注意: 我省略了在表格中显示年、月和日列以使其更清楚。
解决方案
据我所知,逻辑是从给定登录日期到下一个登录日期的天数,大概是最近日期到当前日期为止。
这表明这样的查询:
SELECT id, CONVERT(date, login) as dte,
DATEDIFF(day, login, LEAD(MAX(login), 1, GETDATE()) OVER (PARTITION BY id)) as DAYS_LAST_LOGIN
FROM database.table
WHERE login > DATEADD(month, -3, getdate())
GROUP BY id, CONVERT(date, login)
ORDER BY id, CONVERT(date, login) DESC;
我删除了日期部分,因为我觉得它们没有用,但你当然可以包括它们。
推荐阅读
- aws-lambda - Sam 在本地调用时未对请求正文进行编码
- r - R中的图形文字突然变成斜体
- php - 按字段内容进行分组的查询
- javascript - API 创建中的“request.GET.get”在 Django 中做了什么,它是如何精确工作的?
- css - 放大页面会破坏 Firefox 中的布局,但不会破坏 Chrome
- javascript - 从响应标头(硒)中检索浏览器会话 ID
- mqtt - 从 Broker 收到消息后 MQTT Broker 中的回滚功能
- java - pgloader - 如何将 longblob 作为 oid 导入?
- markdown - 从 Markdown 创建可扩展的 HTML
- python - Scipy 优化最小化仅执行 1 次迭代