mysql - 与前一天相比获得和失去的访问者数量 - sql
问题描述
CREATE TABLE visitors (
Date DATE,
visitor VARCHAR(20));
INSERT INTO visitors VALUES
("2019-10-01", "v1"),
("2019-10-01", "v2"),
("2019-10-01", "v3"),
("2019-10-02", "v2"),
("2019-10-03", "v2"),
("2019-10-03", "v4"),
("2019-10-03", "v5");
请查找每日期的访问人数,与前一天相比获得的访问人数,与前一天相比失去的访问人数。上表的预期结果应该是:
Date | number_of_visitors | number_of_visitors_gained | number_of_visitors_lost
2019-10-01 | 3 | 3 | 0
2019-10-02 | 1 | 0 | 2
2019-10-03 | 3 | 2 | 0
显然,最具挑战性的部分是如何获得最后两列。注意,由于第一天没有前一天,所以number_of_visitors_gained
是第一天的访客总数,并且number_of_visitors_lost
是0。
解决方案
如果您的 RDBMS 支持窗口函数,您可以聚合,然后使用lag()
:
select
date,
number_of_visitors,
case
when lag(number_of_visitors) over(order by date) is null
then number_of_visitors
when lag(number_of_visitors) over(order by date) < number_of_visitors
then number_of_visitors - lag(number_of_visitors) over(order by date)
else 0
end number_of_visitors_gained,
case when lag(number_of_visitors) over(order by date) > number_of_visitors
then lag(number_of_visitors) over(order by date) - number_of_visitors
else 0
end number_of_visitors_lost
from (
select date, count(*) number_of_visitors
from visitors
group by date
) t
order by date
日期 | number_of_visitors | number_of_visitors_gained | number_of_visitors_lost :--------- | -----------------: | ------------------------------------: | ----------------------: 2019-10-01 | 3 | 3 | 0 2019-10-02 | 1 | 0 | 2 2019-10-03 | 3 | 2 | 0
推荐阅读
- javascript - 当两个输入都有值时如何向元素添加类
- c# - 为应用程序保留可写数据库的正确方法
- c# - 实体对象不能被多个 IEntityChangeTracker 实例引用 编辑 DataGrid 行
- python - 是否可以在没有输入层的情况下在 Keras 功能 API 中创建模型?
- java - Fluent-bit 日志转发器问题
- php - 通过 comment_id == parent_id 对多维数组进行排序
- reactjs - 如何在连接的反应路由器和历史中管理语言
- flutter - Flutter/Dart:如何从 Colorgradient 获得单色?
- logical-operators - 用 CFC 编写的 ABB 自动化构建器 codesys 代码挂起并显示异常行为
- reactjs - 如何使用 cordova-plugin-media 将音频录制到 File()?