在 SQL 中查找没有销售的最大连续天数

问题描述 投票:0回答:1

我使用的 DBMS 是 Teradata。

我有一个名为 Sales 的表,其中包含以下列: 商店、商品、DT 和体积

这是每日销售表,其中Store和Item是数字,DT是日期。

现在,可能的情况是,如果商店/商品组合在特定日期没有任何销售额,则表中可能没有条目,或者其条目的销量值为 0。我必须考虑这两种情况。

我想计算商店/商品组合没有销售的最大连续天数,其中日期范围在“2023-12-31”和“2024-03-30”之间

这是我想出的,但不幸的是它没有考虑很多情况:

SELECT 
    sq.STORE,
    sq.ITEM,
    MAX(sq.Consec_No_Sales_Days) AS Max_Consec_No_Sales_Days
FROM (
    SELECT 
        STORE,
        ITEM,
        DT - LAG(DT) 
        OVER(ORDER BY STORE,ITEM,DT) AS Consec_No_Sales_Days
    FROM
    SALES

    WHERE
    SALES.VOLUME > 0
    AND DT BETWEEN '2023-12-31' AND '2024-03-30'


    GROUP BY
    STORE,
    ITEM,
    DT
) sq

WHERE 
    sq.Consec_No_Sales_Days > 0 
GROUP BY
    sq.STORE,
    sq.ITEM
sql teradata
1个回答
0
投票

如果您要获取特定期间(“2023-12-31”-“2024-03-30”)的数据,并且您在该期间开始之前拥有数据,那么具有该属性的商店/商品的先前销售日期是多少? '2024-01-10'期间首次销售???
注意:在这种情况下,下面的代码将周期的开始作为上一个销售日期(使用 Coalesce 函数)。如果这不行 - 您应该进行适当的调整以满足您的需求。

/*  SALES table sample data
     STORE       ITEM DT             VOLUME
---------- ---------- ---------- ----------
        10        101 2023-11-30         12
        10        101 2023-12-31         10
        10        101 2024-01-25         21
        10        103 2024-03-25         32
        10        103 2024-03-30         10
        20        107 2024-01-30         54
        20        107 2024-02-12         23
        20        109 2024-03-01         43    */

创建排除空或零 VOLUME 行的内部查询,并仅获取时间段内的行(Where 子句)。如果没有空/零卷行,如果分区和按部分排序没问题,LAG() Over() 分析函数将正常工作。还有一个日期数学计算 DAY_DIFF 列,如上面的注释中所述。外部查询只是对内部查询的结果集进行聚合和分组。

--      S Q L :
SELECT    STORE, ITEM, Max(DAY_DIFF) AS MAX_DAY_DIFF
FROM    ( Select    STORE, ITEM, DT, VOLUME, 
                     DT - Coalesce( LAG(DT) Over(Partition By STORE, ITEM Order By DT), To_Date('2023-12-31', 'yyyy-mm-dd') ) AS DAY_DIFF
          From      sales
          Where     Coalesce(VOLUME, 0) > 0 And 
                    DT Between DATE '2023-12-31' And DATE '2024-03-30'
        )
GROUP BY  STORE, ITEM
ORDER BY  STORE, ITEM
/*        R e s u l t : 
     STORE       ITEM MAX_DAY_DIFF
---------- ---------- ------------
        10        101           25
        10        103           85
        20        107           30
        20        109           61  */
© www.soinside.com 2019 - 2024. All rights reserved.