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语句之间的天数差异的主要内容,如果未能解决你的问题,请参考以下文章

SQL:查找按用户分组的最新两个记录之间的差异

利用SQL语句如何获得两个日期之间相差的天数

利用SQL语句如何获得两个日期之间相差的天数

试图在Python中找到用户出生日期和现在之间的天数差异

如何计算两个日期之间的差异?

如何找到两个日期之间的天数差异[重复]