小编典典

如何按连续数据分组(在这种情况下为日期)

sql

我有一个products表和一个sales表,该表记录着给定产品在每个日期售出了多少个项目。当然,并非所有产品每天都有销售。

我需要生成一个报告,告诉我产品 连续 几天销售(从最新日期到过去),以及仅在那几天销售了多少物品。

我想告诉您到目前为止我已经尝试了多少方法,但是唯一成功(缓慢,递归)的方法是应用程序内部的解决方案,而不是SQL内部的解决方案,这就是我想要的。

我还浏览了关于SO的几个类似问题,但没有找到一个让我对我真正需要的东西有清晰认识的问题。

我在这里设置了一个SQLFiddle来向您展示我在说什么。在这里,您将看到我能想到的唯一查询,但没有得到我需要的结果。我还在那里添加了注释,以显示查询结果。

我希望这里的人知道如何做到这一点。预先感谢您的任何评论!

弗朗西斯科


阅读 240

收藏
2021-04-07

共1个答案

小编典典

http://sqlfiddle.com/#!2/20108/1

这是完成工作的存储过程

CREATE PROCEDURE myProc()
BEGIN
    -- Drop and create the temp table
    DROP TABLE IF EXISTS reached;
    CREATE TABLE reached (
    sku CHAR(32) PRIMARY KEY,
    record_date date,
    nb int,
    total int)
   ENGINE=HEAP;

-- Initial insert, the starting point is the MAX sales record_date of each product
INSERT INTO reached 
SELECT products.sku, max(sales.record_date), 0, 0
FROM products
join sales on sales.sku = products.sku
group by products.sku;

-- loop until there is no more updated rows
iterloop: LOOP
    -- Update the temptable with the values of the date - 1 row if found
    update reached
    join sales on sales.sku=reached.sku and sales.record_date=reached.record_date
    set reached.record_date = reached.record_date - INTERVAL 1 day, 
        reached.nb=reached.nb+1, 
        reached.total=reached.total + sales.items;

    -- If no more rows are updated it means we hit the most longest days_sold
    IF ROW_COUNT() = 0 THEN
        LEAVE iterloop;
    END IF;
END LOOP iterloop;

-- select the results of the temp table
SELECT products.sku, products.title, products.price, reached.total as sales, reached.nb as days_sold 
from reached
join products on products.sku=reached.sku;

END//

那你只需要做

call myProc()
2021-04-07