Mysql 获得连续一周的参赛作品

Mysql 获得连续一周的参赛作品,mysql,Mysql,我有一个MYSQL表,有两个ID列和一个日期列。我正在尝试根据日期列获取连续的周数 |ID|ID2|Date | |1 | 1 |2018-01-01| |1 | 1 |2018-01-08| |1 | 1 |2018-01-15| |2 | 1 |2018-01-01| |2 | 1 |2018-01-08| |2 | 2 |2018-01-01| 我想要的是这样一张桌子 |ID |ID2|Consecutive Week| |1 | 1 |3 | |

我有一个MYSQL表,有两个ID列和一个日期列。我正在尝试根据日期列获取连续的周数

|ID|ID2|Date      |
|1 | 1 |2018-01-01|
|1 | 1 |2018-01-08|
|1 | 1 |2018-01-15|
|2 | 1 |2018-01-01|
|2 | 1 |2018-01-08|
|2 | 2 |2018-01-01|
我想要的是这样一张桌子

|ID |ID2|Consecutive Week|
|1  | 1 |3               |
|2  | 1 |2               |
|2  | 2 |1               |
我被以下代码困住了:

SELECT a.ID, a.ID2 ,consec_set, COUNT(1) AS consec_count
FROM
(
   SELECT IF(b.Date IS NULL, @val:=@val+1, @val) AS consec_set,a.ID2
   FROM tbl a
   CROSS JOIN (SELECT @val:=0) var_init
   LEFT JOIN tbl b ON 
       a.ID = b.ID AND
       a.ID2 = b.ID2 AND
       YEARWEEK(a.Date ,1) = YEARWEEK(b.Date ,1) + 1
   WHERE a.ID= 1
) a
GROUP BY a.consec_set;

我在这里遵循了几条指南,但它们只有连续几天和一个ID。提前谢谢。

不是答案。评论太长了

考虑以下几点:

SELECT *, YEARWEEK(date,1) yw FROM my_table;
+-----+-----+------------+--------+
| ID1 | ID2 | Date       | yw     |
+-----+-----+------------+--------+
|   1 |   1 | 2018-01-01 | 201801 |
|   1 |   1 | 2018-01-08 | 201802 |
|   1 |   1 | 2018-01-15 | 201803 |
|   2 |   1 | 2018-01-01 | 201801 |
|   2 |   1 | 2018-01-07 | 201801 |
|   2 |   2 | 2018-01-01 | 201801 |
+-----+-----+------------+--------+

1,1 = 3 consecutive weeks
2,1 = 1 week
2,2 = 1 week

不知何故,我成功了SQL。不过有点复杂

SELECT id, id2, Max(cnt) FROM (
    SELECT id, id2, Count(id) AS CNT FROM (
        SELECT *, (
            SELECT @num:=Ifnull(@num,0)) AS grouper, 
                   @num := IF(cntn=0, @num+1, @num) AS row_number  
            FROM (
                SELECT a.id, a.id2, a.wno, b.id IS NOT NULL AS CNTN 
                FROM (
                    SELECT DISTINCT id, id2, Week(pdate) AS WNO FROM listing) a
                    LEFT JOIN
                        (SELECT DISTINCT id, id2, Week(pdate) AS WNO FROM listing) b
                    ON a.wno = b.wno - 1 AND a.id = b.id AND a.id2 = b.id2
                    ORDER BY a.id, a.id2, a.wno
                ) d 
            ) e GROUP BY e.id, e.id2, e.grouper
        ) f GROUP BY f.id, f.id2
下面是我在评论中提到的所有案例的重点,包括:

由内而外解释:

  • 从表中选择不同的周数、ID、ID2值
  • 加入了1。如果表存在,请在连续的表上重新设置为自身
  • 无论连续记录是否存在,都将连接的行转换为布尔值
  • 使用索引(如1、2、3等)对连续行进行分组
  • 选择组的计数
  • 选择具有相同ID和ID1的最大组数

  • 你能定义“周”吗?@草莓的“周”是指一年中的一周,或者是指一年中的一周(日期,1)的结果。连续周是(例如)一个ID,在一年中的第1周和第2周至少有一个条目。我不清楚如果1,1也有日期2018-02-10(例如),您的输出会是什么样子,即如果有多个离散的连续年周,该怎么办。对于ID=2和ID2=1,该周不是连续的。两个日期在同一周。应该是1吗?如果表上有这一行,
    |1 | 1 | 2018-02-15 |
    ,输出应该是什么?想法不错,但我认为这种方法会减慢执行时间,因为我需要对一个包含30多万条目的表进行额外选择。谢谢你的提示。这里没有“思考”的事情。我只是在证明,有3个连续的星期,1个连续的星期,还有1个连续的星期。该死的传奇人物!6个小时的挣扎。你是救世主!谢谢,我喜欢有挑战性的:)每30万台0.0220秒不错:)我没想到会有这么快。