SQL查找用户分区的两个case语句之间的天数差异
Posted
技术标签:
【中文标题】SQL查找用户分区的两个case语句之间的天数差异【英文标题】:SQL find the difference in days between two case statements partitioned by users 【发布时间】:2021-04-26 17:36:56 【问题描述】:假设我有一张这样的桌子:http://sqlfiddle.com/#!9/800cb5
CREATE TABLE IF NOT EXISTS `transactions` (
`user_id` int(6) unsigned NOT NULL,
`created_at` datetime NOT NULL,
`bow` int(6) NOT NULL,
`eow` int(6) NOT NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `transactions` (`user_id`, `created_at`, `bow`, `eow`) VALUES
('1', '2019-01-01', '0', '1'),
('1', '2019-01-02', '1', '1'),
('1', '2019-01-03', '1', '1'),
('1', '2019-01-05', '1', '0'),
('2', '2019-01-11', '1', '1'),
('1', '2019-02-01', '0', '1'),
('1', '2019-02-02', '1', '1'),
('1', '2019-02-03', '1', '0');
如果当“eow”等于1时“bow”等于0,我想开始计算天数。我想在“bow”等于1和“eow”等于0时停止计数,然后取这两个值之间的天数。
所以我的输出是:
(`user_id`, `created_at`, `days`)
('1', '2019-01-05', '4')
('1', '2019-02-03', '2')
因为 2019-01-01 和 2019-01-05 之间有 4 天,2019-02-01 和 2019-02-03 之间有 2 天。
【问题讨论】:
【参考方案1】:您可以使用窗口函数 -- 特别是累积条件 max()
来获取上一个日期。
然后只过滤周期结束的位置:
select t.*,
datediff(created_at, prev_created_at)
from (select t.*,
max(case when bow = 0 and eow = 1 then created_at end) over (order by created_at) as prev_created_at
from transactions t
) t
where bow = 1 and eow = 0;
Here 是一个 dbfiddle。
【讨论】:
谢谢戈登!正是我想要的以上是关于SQL查找用户分区的两个case语句之间的天数差异的主要内容,如果未能解决你的问题,请参考以下文章