在特定的最后12个月内缺少特定周期时,如何动态添加与最后12个月数据值的行动行?

发布于 2025-01-28 18:42:40 字数 3271 浏览 3 评论 0原文

这是输入表:

项目QTYDATEPERIOD
A21/1/2020 0:00
A32/1/2020 0:00
A43/1/2020 0:00
A14/1/2020 0:00
A25/1/2020 0:00
A26/1/2020 0:00
A28/1/2020
0:00 A210/1/2020
0:00 A212/1/2020 0:00
A21/1/2021 0:00
A32/1/2021 0:00
A43/1/2021 0:00
A25/1/2021
0:00 A26/1/2021 0:00
A28/1/2021 0:00
A19/1/2021 0:00
A210/1/2021 0:00
A111/1/2021
A112/1/2021 0:00

0:00 输入表没有2021年7月的数据,当我必须计算每个行的最后12个月的数据时,我将能够从2021年12月至2021年8月获得最后12个月的数据。

但是,由于输入表确实确实没有2021年7月的数据,使用通常的查询

SUM(qty) OVER (
           PARTITION BY item
           ORDER BY dateperiod
           RANGE BETWEEN INTERVAL '11' MONTH PRECEDING
                 AND     INTERVAL '0' MONTH FOLLOWING
         ) AS total,

将生成2021年6月的最后12个月数据。但是,即使数据在7月至2021年不可用,预期的输出也可以在过去12个月内动态生成一行2021年7月至2021年7月至2020年8月的数据。QTY的结果是:19

类似地,输入表丢失了2021年4月的数据。然后,查询与上一个12个月的数据一起生成了一行, 结果应

该数量的2020
20214
5月 20209
A4/1/202010
A5/1/202012
A6/1/202014
A7/1/202014
A8/1/202016
A9/1/202016
A10/1/202018
A11/1/202018
A12/1/202020
A1/1/202120
A2/1/202120
A3/1/202120
A4/1/202119
A5/1/202119
A6/1/202119
A7/1/202119
A8/1/202119
A9/1/202120
A10/1/202120
A11/1/202121
A12/1/2021/202120

请让我知道这是否可能

This is the input Table:

ITEMQTYDATEPERIOD
A21/1/2020 0:00
A32/1/2020 0:00
A43/1/2020 0:00
A14/1/2020 0:00
A25/1/2020 0:00
A26/1/2020 0:00
A28/1/2020 0:00
A210/1/2020 0:00
A212/1/2020 0:00
A21/1/2021 0:00
A32/1/2021 0:00
A43/1/2021 0:00
A25/1/2021 0:00
A26/1/2021 0:00
A28/1/2021 0:00
A19/1/2021 0:00
A210/1/2021 0:00
A111/1/2021 0:00
A112/1/2021 0:00

This input table does not have data of 2021-July, when I have to calculate the data of last 12 month for each rows, I will be able to get data of last 12 months from dec 2021 to Aug 2021.

But since the input table does not have data of 2021-July, using usual query

SUM(qty) OVER (
           PARTITION BY item
           ORDER BY dateperiod
           RANGE BETWEEN INTERVAL '11' MONTH PRECEDING
                 AND     INTERVAL '0' MONTH FOLLOWING
         ) AS total,

would generate last 12 month data for June 2021. But the expected output is even if the data is not available in July-2021, is it possible to dynamically generate a row as last 12 month data for July-2021 which should be from July 2021 to Aug 2020. The result of the qty is: 19

similarly, the input table is missing data for April 2021. Then the query generate a row as last 12 month data for April-2021 which should be from April 2021 to May 2020. The result of the qty is: 19

So the expected output will be in the form of

ITEMDATEPERIODOutput
A1/1/20202
A2/1/20205
A3/1/20209
A4/1/202010
A5/1/202012
A6/1/202014
A7/1/202014
A8/1/202016
A9/1/202016
A10/1/202018
A11/1/202018
A12/1/202020
A1/1/202120
A2/1/202120
A3/1/202120
A4/1/202119
A5/1/202119
A6/1/202119
A7/1/202119
A8/1/202119
A9/1/202120
A10/1/202120
A11/1/202121
A12/1/202120

Please let me know if this is possible

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

把昨日还给我 2025-02-04 18:42:40

您可以使用层次查询来生成日历,并使用ofter Join将其连接到数据(但是,由于您是为每个item进行操作,然后您可能可能想要一个分区 ed 外部加入):

WITH calendar (month) AS (
  SELECT ADD_MONTHS(min_dp, LEVEL - 1) AS month
  FROM   (
    SELECT MIN(dateperiod) AS min_dp,
           MAX(dateperiod) AS max_dp
    FROM   table_name
  )
  CONNECT BY ADD_MONTHS(min_dp, LEVEL - 1) <= max_dp
)
SELECT item,
       c.month AS dateperiod,
       COALESCE(t.qty, 0) AS qty,
       SUM(t.qty) OVER (
           PARTITION BY t.item
           ORDER BY c.month
           RANGE BETWEEN INTERVAL '11' MONTH PRECEDING
                 AND     INTERVAL '0' MONTH FOLLOWING
         ) AS total
FROM   calendar c
       LEFT OUTER JOIN table_name t
       PARTITION BY (t.item)
       ON (c.month = t.dateperiod);

对于您的示例数据:

CREATE TABLE table_name (ITEM, QTY, DATEPERIOD) AS
SELECT 'A', 2, DATE '2020-01-01' FROM DUAL UNION ALL
SELECT 'A', 3, DATE '2020-02-01' FROM DUAL UNION ALL
SELECT 'A', 4, DATE '2020-03-01' FROM DUAL UNION ALL
SELECT 'A', 1, DATE '2020-04-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2020-05-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2020-06-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2020-08-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2020-10-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2020-12-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2021-01-01' FROM DUAL UNION ALL
SELECT 'A', 3, DATE '2021-02-01' FROM DUAL UNION ALL
SELECT 'A', 4, DATE '2021-03-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2021-05-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2021-06-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2021-08-01' FROM DUAL UNION ALL
SELECT 'A', 1, DATE '2021-09-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2021-10-01' FROM DUAL UNION ALL
SELECT 'A', 1, DATE '2021-11-01' FROM DUAL UNION ALL
SELECT 'A', 1, DATE '2021-12-01' FROM DUAL;

输出:

itemdateperiodqtytotal
a2020-01-01 00:00:0022
a2020-02-01 00:00:0035
a2020-03-01 00:00:0049
a2020-04-01 00:00:00110
a2020-05-01 00:00:00212
a2020-06-01 00:00:00214
a2020-07-01 00:00:00014
a2020-08-01 00:00:00216
a2020-09-01 00:00:00016
a2020-10-01 00:00:00218
a2020-11-01 00:00:00018
a2020-12-01 00:00:00220
a2021-01-01 00:00:00220
a2021-02-01 00:00:00320
a2021-03-01 00:00:00420
a2021-04-01 00:00:00019
a2021-05-01 00:00:00219
a2021-06-01 00:00:00219
a2021-07-01 00:00:00019
a2021-08-01 00:00:00219
a2021-09-01 00:00:00120
a2021-10-01 00:00:00220
a2021-11-01 00:00:00121
a2021-12-01 00:00:00120

db&lt; “ nofollow noreferrer”>在这里

You can use a hierarchical query to generate a calendar and the use an OUTER JOIN to join it to your data (however, since you are doing it for each item then you probably want a PARTITIONed OUTER JOIN):

WITH calendar (month) AS (
  SELECT ADD_MONTHS(min_dp, LEVEL - 1) AS month
  FROM   (
    SELECT MIN(dateperiod) AS min_dp,
           MAX(dateperiod) AS max_dp
    FROM   table_name
  )
  CONNECT BY ADD_MONTHS(min_dp, LEVEL - 1) <= max_dp
)
SELECT item,
       c.month AS dateperiod,
       COALESCE(t.qty, 0) AS qty,
       SUM(t.qty) OVER (
           PARTITION BY t.item
           ORDER BY c.month
           RANGE BETWEEN INTERVAL '11' MONTH PRECEDING
                 AND     INTERVAL '0' MONTH FOLLOWING
         ) AS total
FROM   calendar c
       LEFT OUTER JOIN table_name t
       PARTITION BY (t.item)
       ON (c.month = t.dateperiod);

Which, for your sample data:

CREATE TABLE table_name (ITEM, QTY, DATEPERIOD) AS
SELECT 'A', 2, DATE '2020-01-01' FROM DUAL UNION ALL
SELECT 'A', 3, DATE '2020-02-01' FROM DUAL UNION ALL
SELECT 'A', 4, DATE '2020-03-01' FROM DUAL UNION ALL
SELECT 'A', 1, DATE '2020-04-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2020-05-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2020-06-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2020-08-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2020-10-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2020-12-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2021-01-01' FROM DUAL UNION ALL
SELECT 'A', 3, DATE '2021-02-01' FROM DUAL UNION ALL
SELECT 'A', 4, DATE '2021-03-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2021-05-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2021-06-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2021-08-01' FROM DUAL UNION ALL
SELECT 'A', 1, DATE '2021-09-01' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2021-10-01' FROM DUAL UNION ALL
SELECT 'A', 1, DATE '2021-11-01' FROM DUAL UNION ALL
SELECT 'A', 1, DATE '2021-12-01' FROM DUAL;

Outputs:

ITEMDATEPERIODQTYTOTAL
A2020-01-01 00:00:0022
A2020-02-01 00:00:0035
A2020-03-01 00:00:0049
A2020-04-01 00:00:00110
A2020-05-01 00:00:00212
A2020-06-01 00:00:00214
A2020-07-01 00:00:00014
A2020-08-01 00:00:00216
A2020-09-01 00:00:00016
A2020-10-01 00:00:00218
A2020-11-01 00:00:00018
A2020-12-01 00:00:00220
A2021-01-01 00:00:00220
A2021-02-01 00:00:00320
A2021-03-01 00:00:00420
A2021-04-01 00:00:00019
A2021-05-01 00:00:00219
A2021-06-01 00:00:00219
A2021-07-01 00:00:00019
A2021-08-01 00:00:00219
A2021-09-01 00:00:00120
A2021-10-01 00:00:00220
A2021-11-01 00:00:00121
A2021-12-01 00:00:00120

db<>fiddle here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文