我使用的 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
如果您要获取特定期间(“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 */