【发布时间】:2018-06-11 14:59:35
【问题描述】:
给定数据和sql命令
WITH
TableItem AS (
SELECT 'Item18-0001' AS ItemNr, TIMESTAMP '2018-04-30' AS PostingDate, 1 AS Quantity UNION ALL
SELECT 'Item18-0002' AS ItemNr, TIMESTAMP '2018-04-30' AS PostingDate, 2 AS Quantity UNION ALL
SELECT 'Item18-0003' AS ItemNr, TIMESTAMP '2018-04-30' AS PostingDate, 3 AS Quantity UNION ALL
SELECT 'Item18-0004' AS ItemNr, TIMESTAMP '2018-04-30' AS PostingDate, 4 AS Quantity UNION ALL
# missing 2018-05-01
# missing Item18-004
# new Item18-0006
SELECT 'Item18-0001' AS ItemNr, TIMESTAMP '2018-05-02' AS PostingDate, 1 AS Quantity UNION ALL
SELECT 'Item18-0002' AS ItemNr, TIMESTAMP '2018-05-02' AS PostingDate, 1 AS Quantity UNION ALL
SELECT 'Item18-0003' AS ItemNr, TIMESTAMP '2018-05-02' AS PostingDate, 1 AS Quantity UNION ALL
SELECT 'Item18-0005' AS ItemNr, TIMESTAMP '2018-05-02' AS PostingDate, 5 AS Quantity UNION ALL
# missing Item18-0004, Item18-0005
# new Item18-0006
SELECT 'Item18-0001' AS ItemNr, TIMESTAMP '2018-05-03' AS PostingDate, 1 AS Quantity UNION ALL
SELECT 'Item18-0002' AS ItemNr, TIMESTAMP '2018-05-03' AS PostingDate, 2 AS Quantity UNION ALL
SELECT 'Item18-0003' AS ItemNr, TIMESTAMP '2018-05-03' AS PostingDate, 3 AS Quantity UNION ALL
SELECT 'Item18-0006' AS ItemNr, TIMESTAMP '2018-05-03' AS PostingDate, 6 AS Quantity UNION ALL
# some missing
SELECT 'Item18-0002' AS ItemNr, TIMESTAMP '2018-05-04' AS PostingDate, 2 AS Quantity UNION ALL
SELECT 'Item18-0002' AS ItemNr, TIMESTAMP '2018-05-04' AS PostingDate, 2 AS Quantity UNION ALL
SELECT 'Item18-0003' AS ItemNr, TIMESTAMP '2018-05-04' AS PostingDate, 3 AS Quantity UNION ALL
SELECT 'Item18-0003' AS ItemNr, TIMESTAMP '2018-05-04' AS PostingDate, 3 AS Quantity UNION ALL
# some missing, some new
SELECT 'Item18-0001' AS ItemNr, TIMESTAMP '2018-05-05' AS PostingDate, 1 AS Quantity UNION ALL
SELECT 'Item18-0003' AS ItemNr, TIMESTAMP '2018-05-05' AS PostingDate, 3 AS Quantity UNION ALL
SELECT 'Item18-0005' AS ItemNr, TIMESTAMP '2018-05-05' AS PostingDate, 5 AS Quantity UNION ALL
SELECT 'Item18-0007' AS ItemNr, TIMESTAMP '2018-05-05' AS PostingDate, 7 AS Quantity ),
# Cross Join to get all combinations of ItemNr and PostingDate
TableItemNrPostingDate AS (
SELECT
ItemNr,
PostingDate
FROM (
SELECT
it1.ItemNr
FROM
TableItem it1
GROUP BY
it1.ItemNr ) t2
CROSS JOIN (
SELECT
it2.PostingDate
FROM
TableItem it2
GROUP BY
it2.PostingDate ) t3 ),
# Create Calender Table to get missing dates
TableCalenderDayItemNrPostingDate AS (
SELECT
CalenderDay,
TableItemNrPostingDate.ItemNr As ItemNr,
TableItemNrPostingDate.PostingDate as PostingDate
FROM
UNNEST( GENERATE_DATE_ARRAY("2018-04-30", DATE_ADD(DATE_ADD(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL 1 MONTH), INTERVAL -1 DAY), INTERVAL 1 DAY)) AS CalenderDay
LEFT JOIN
TableItemNrPostingDate
ON
CalenderDay = DATE(TableItemNrPostingDate.PostingDate)
ORDER BY
CalenderDay )
SELECT
CalenderDay,
FIRST_VALUE(ItemNr) OVER (PARTITION BY ItemNr ORDER BY CalenderDay ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
ItemNr,
PostingDate
FROM
TableCalenderDayItemNrPostingDate
ORDER BY
CalenderDay, ItemNr
我想从“开始”获取每个 ItemNr 和每个日历日期的 ItemNr、PostingDate、Quantity。缺失值必须用以前的值填充。
我的表格将仅使用更改的数量和日期来填充/更新。这意味着并非所有项目每天都会更新,新项目稍后会出现在表格中,并且在某些日子里根本没有任何变化。
对于给定的数据,我希望得到结果。 Quantity = ItemNr 以便于识别。
Item18-0001 2018-04-30 1
Item18-0002 2018-04-30 2
Item18-0003 2018-04-30 3
Item18-0004 2018-04-30 4
Item18-0005 2018-04-30 0 (or null or empty row)
Item18-0006 2018-04-30 0 (or null or empty row)
Item18-0007 2018-04-30 0 (or null or empty row)
Item18-0001 2018-05-01 1
Item18-0002 2018-05-01 2
Item18-0003 2018-05-01 3
Item18-0004 2018-05-01 4
Item18-0005 2018-05-01 0 (or null or empty row)
Item18-0006 2018-05-01 0 (or null or empty row)
Item18-0007 2018-05-01 0 (or null or empty row)
Item18-0001 2018-05-02 1
Item18-0002 2018-05-02 2
Item18-0003 2018-05-02 3
Item18-0004 2018-05-02 4
Item18-0005 2018-05-02 5
Item18-0006 2018-05-02 0 (or null or empty row)
Item18-0007 2018-05-02 0 (or null or empty row)
Item18-0001 2018-05-03 1
Item18-0002 2018-05-03 2
Item18-0003 2018-05-03 3
Item18-0004 2018-05-03 4
Item18-0005 2018-05-03 5
Item18-0006 2018-05-03 6
Item18-0007 2018-05-03 0 (or null or empty row)
Item18-0001 2018-05-04 1
Item18-0002 2018-05-04 2
Item18-0003 2018-05-04 3
Item18-0004 2018-05-04 4
Item18-0005 2018-05-04 5
Item18-0006 2018-05-04 6
Item18-0007 2018-05-03 0 (or null or empty row)
Item18-0001 2018-05-05 1
Item18-0002 2018-05-05 2
Item18-0003 2018-05-05 3
Item18-0004 2018-05-05 4
Item18-0005 2018-05-05 5
Item18-0006 2018-05-05 6
Item18-0007 2018-05-05 7
我的 SQL 命令没有准备好并且错误。我只想表明我的努力或意图。
【问题讨论】:
标签: sql google-bigquery aggregate-functions missing-data