连续日期的MySQL实现

标签 mysql date group-by

我需要一个出色代码的 MySQL 实现来回答这个问题:

Consecutive Streak of Dates

我有完全相同的问题 - 但(据我所知)MySQL 不支持 DENSE_RANK()ROW_NUMBER()

如果有人能指出我正确的方向,那就太好了。我尝试使用此处找到的基于月份的查询版本:forums.mysql.com: Group By Consecutive Dateshere但是查询陷入了 6,000 个“用户”的 300,000 个不是很连续的记录

非常感谢

最佳答案

好的。因此,除了“自上次范围结束以来的月数”字段之外,此答案应该为您提供所需的一切。也许您可以在此基础上自己弄清楚 ;-)。我已将 #data 表(在 Consecutive Streak of Dates 帖子中引用)重命名为 payment:

CREATE TABLE payment
(
Contact_reference VARCHAR(55),
Date_payment DATETIME,
Payment_value double
);

INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2003-06-08',12.82);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2004-06-08',12.82);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2004-12-08',12.82);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2005-04-08',12.82);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2005-05-08',12.82);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2005-06-08',12.82);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2005-07-08',12.82);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2005-08-08',12.82);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2005-09-08',12.82);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2005-10-10',12.8205);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2005-11-10',12.8205);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2005-12-10',12.8205);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2006-01-10',12.8205);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2006-02-10',12.8205);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2006-02-28',12.8205);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2006-04-12',12.8205);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2006-05-10',19.2308);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2007-06-11',19.2308);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2007-07-10',19.2308);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2007-08-09',19.2308);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2007-09-10',19.2308);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2007-10-09',19.2308);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2007-11-09',19.2308);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2007-12-10',19.2308);
INSERT INTO payment VALUES ('18EC3CD2-3065-4FF4-BE40-000004228590','2008-01-10',19.2308);

select Contact_reference,
consecStartDate as Range_start,
max(Date_payment) as Range_end,
count(*) as Payments,
sum(Payment_value) as value
from
(
select Contact_reference,
case when year(Date_payment)*12 + month(Date_payment) - @curMonthNum  <= 1 and @curRef = Contact_reference then 'Y' else 'N' end as consec,
case when year(Date_payment)*12 + month(Date_payment) - @curMonthNum  <= 1 and @curRef = Contact_reference then @consecStartDate := @consecStartDate else @consecStartDate := Date_payment  end as consecStartDate,
Date_payment,Payment_value,
@curMonthNum := year(Date_payment)*12 + month(Date_payment),
@curRef := Contact_reference
from payment
inner join (SELECT @consecStartDate := null,@curMonthNum := null,@consecStart := null,@curRef := null) as t
order by Contact_reference desc,Date_payment asc
) n
group by Contact_reference,consecStartDate;

就像我说的 - 它不会给你自上次范围结束以来的间隔,但我认为答案的一部分总比没有好!

关于连续日期的MySQL实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8461360/

相关文章:

MySQL 日期不等于当前年份

php - 如何制作登录页面以添加到我当前的代码中

mysql - 将日期与不能立即在 mysql 中连接的表进行比较

javascript - jQuery UI 日期选择器 mm/dd/y 格式年份 1915 转换为 2015

mysql - 按顺序选择Mysql条件组的问题

mysql - 按月/年分组并对所有数据求和

python - 如何根据列中连续出现的值将 pandas 数据框拆分为多个部分?

php - 如何在 Eloquent 中获取一个属性抛出一个表?

mysql - MAX() 是否可以提高查询性能?

javascript - MongoDB ISODate() 给出的结果与 Date() 不同吗?