1

我有一个要求在下面做。

我有一张sales表格,其中包含几个产品项目(ABC1、ABC2、...、ABC7)的过去一年的销售数据。

Invoice Number  Date        Product ID  Sales
........       .........       ....      ..
IN000945       1/01/2019       ABC1      2
IN000946       2/01/2019       ABC2      4
IN000947       2/01/2019       ABC1      6
IN000948       4/01/2019       ABC1      1
IN000949       4/01/2019       ABC1      9
IN000950       4/01/2019       ABC3      10
IN000951       4/01/2019       ABC6      1
IN000952       8/01/2019       ABC2      12
IN000953       9/01/2019       ABC2      3
........       .........       ....      ..
IN567953       31/12/2019      ABC7      12
........       .........       ....      ..

要求 我想创建一个包含以下数据的表。它将用于训练模型。

  1. 我只想要来自 ABC1、ABC2 和 ABC3 产品的记录。
  2. 在过去一年的日期范围内,我想选择 160 个随机日期(例如)并计算以下内容。
  3. 从随机日期开始,计算过去一周的数据、过去 4 周的数据和未来 4 周的数据。
  4. 数据始终可用于为任何边缘日期生成汇总数据。例如,2019 年 12 月 31 日。在分析中,我们只对计算过去一年的数据感兴趣。

    我不想从表中的日期中获取随机日期。相反,我想从过去一年的所有可能的 365 个日期中生成随机日期,即使该日期没有特定记录。对于给定的日期,我想要所有 3 种产品的汇总数据。因此,对于给定的日期,将有 3 条记录,如最终输出表所示。

决赛桌看起来与此类似。

Date       Product  Past week   Past 4 week Future 4 week
4/03/2019   ABC1    12           34              34
4/03/2019   ABC2    11           52              24
4/03/2019   ABC3    6            23              45
8/06/2019   ABC1    15           34              32
8/06/2019   ABC2    13           45              65
8/06/2019   ABC3    12           56              34
14/09/2019  ABC1    12           65              32
14/09/2019  ABC2    14           12              26
14/09/2019  ABC3    12           76              31
..........  ....    ..           ..              ..
12/10/2019  ABC3    15           34              25

我不知道如何解决这个问题。谢谢您的帮助。

4

1 回答 1

2

您提供的数据不足。

销售额是通过对树时间段内产品的所有数据求和来计算的

随机 180 个日期由内部 SELECT 查询中的 ORDER BY RAND() LIMIT 180 选择

ORDER BY t1.date 很重要,因为如果你不放 t1 则以转换后的文本为基础,字符串顺序与 dazes 不同

CREATE TABLE sales
    (`Invoice Number` varchar(8), `Date` varchar(10), `Product ID` varchar(4), `Sales` varchar(2))
;
    
INSERT INTO sales
    (`Invoice Number`, `Date`, `Product ID`, `Sales`)
VALUES
    ('IN000945', '15/08/2019', 'ABC1', '2'),
    ('IN000946', '16/08/2019', 'ABC2', '4'),
    ('IN000947', '17/08/2019', 'ABC1', '6'),
    ('IN000948', '18/08/2019', 'ABC1', '1'),
    ('IN000949', '19/08/2019', 'ABC1', '9'),
    ('IN000950', '20/08/2019', 'ABC3', '10'),
    ('IN000951', '21/08/2019', 'ABC6', '1'),
    ('IN000952', '22/08/2019', 'ABC2', '12'),
    ('IN000953', '23/08/2019', 'ABC2', '3'),
    ('IN000945', '1/09/2019', 'ABC1', '2'),
    ('IN000946', '2/09/2019', 'ABC2', '4'),
    ('IN000947', '2/09/2019', 'ABC1', '6'),
    ('IN000948', '4/09/2019', 'ABC1', '1'),
    ('IN000949', '4/09/2019', 'ABC1', '9'),
    ('IN000950', '4/09/2019', 'ABC3', '10'),
    ('IN000951', '4/09/2019', 'ABC6', '1'),
    ('IN000952', '8/09/2019', 'ABC2', '12'),
    ('IN000953', '9/09/2019', 'ABC2', '3')
;
SELECT 
    DATE_FORMAT(`Date`, '%d/%m/%Y') `Date`,
    `Product ID`,
    saleslast1week,
    saleslast28,
    salesfuture28
FROM
    (SELECT 
        @date:=STR_TO_DATE(`Date`, '%d/%m/%Y') `Date`,
            @Product:=`Product ID` `Product ID`,
            (SELECT 
                    SUM(`Sales`)
                FROM
                    sales
                WHERE
                    `Product ID` = @Product
                        AND STR_TO_DATE(`Date`, '%d/%m/%Y') >= @date - INTERVAL 7 DAY
                        AND STR_TO_DATE(`Date`, '%d/%m/%Y') <= @date
                GROUP BY `Product ID`) saleslast1week,
            (SELECT 
                    SUM(`Sales`)
                FROM
                    sales
                WHERE
                    `Product ID` = @Product
                        AND STR_TO_DATE(`Date`, '%d/%m/%Y') >= @date - INTERVAL 28 DAY
                        AND STR_TO_DATE(`Date`, '%d/%m/%Y') <= @date
                GROUP BY `Product ID`) saleslast28,
            (SELECT 
                    SUM(`Sales`)
                FROM
                    sales
                WHERE
                    `Product ID` = @Product
                        AND STR_TO_DATE(`Date`, '%d/%m/%Y') <= @date + INTERVAL 28 DAY
                        AND STR_TO_DATE(`Date`, '%d/%m/%Y') >= @date
                GROUP BY `Product ID`) salesfuture28
    FROM
        sales
    WHERE
        `Product ID` IN ('ABC1' , 'ABC2', 'ABC3')
            AND STR_TO_DATE(`Date`, '%d/%m/%Y') >= NOW() - INTERVAL 14 MONTH
    ORDER BY RAND()
    LIMIT 180) t1
ORDER BY t1.`Date`
日期 | 产品编号 | 上周销售 | 销售持续28 | 销售未来28
:--------- | :--------- | -------------: | ----------: | ------------:
2019 年 8 月 15 日 | ABC1 | 2 | 2 | 36
2019 年 8 月 16 日 | ABC2 | 4 | 4 | 38
2019 年 8 月 17 日 | ABC1 | 8 | 8 | 34
2019 年 8 月 18 日 | ABC1 | 9 | 9 | 28
2019 年 8 月 19 日 | ABC1 | 18 | 18 | 27
20/08/2019 | ABC3 | 10 | 10 | 20
22/08/2019 | ABC2 | 16 | 16 | 34
2019 年 8 月 23 日 | ABC2 | 19 | 19 | 22
2019 年 1 月 9 日 | ABC1 | 2 | 20 | 18
2019 年 2 月 9 日 | ABC1 | 8 | 26 | 16
2019 年 2 月 9 日 | ABC2 | 4 | 23 | 19
2019 年 4 月 9 日 | ABC3 | 10 | 20 | 10
2019 年 4 月 9 日 | ABC1 | 18 | 36 | 10
2019 年 4 月 9 日 | ABC1 | 18 | 36 | 10
2019 年 8 月 9 日 | ABC2 | 16 | 35 | 15
2019 年 9 月 9 日 | ABC2 | 19 | 38 | 3

db<>在这里摆弄

于 2020-04-12T03:17:43.467 回答