【发布时间】:2021-03-26 16:25:16
【问题描述】:
样本表
CREATE TABLE SAMPLE_TABLE (WEEK DATE, TYPE VARCHAR(50), Movie VARCHAR(50), Question VARCHAR(50), Answer VARCHAR(50), value NUMBER(38,0));
样本数据
INSERT INTO sample_table VALUES('10/1/2020', 'A', 'Contaco', '1', 'N/A', '1'),
('10/1/2020', 'A', 'Contaco', '1', 'Definitely not', '4'),
('10/1/2020', 'A', 'Contaco', '1', 'Definitely', '2'),
('10/1/2020', 'A', 'Contaco', '1', 'Probably', '2'),
('10/1/2020', 'A', 'Contaco', '1', 'Maybe', '1'),
('10/8/2020', 'A', 'Contaco', '1', 'N/A', '3'),
('10/8/2020', 'A', 'Contaco', '1', 'Definitely not', '1'),
('10/8/2020', 'A', 'Contaco', '1', 'Definitely', '2'),
('10/8/2020', 'A', 'Contaco', '1', 'Probably', '4'),
('10/8/2020', 'A', 'Contaco', '1', 'Maybe', '1'),
('10/15/2020', 'A', 'Contaco', '1', 'N/A', '2'),
('10/15/2020', 'A', 'Contaco', '1', 'Definitely not', '1'),
('10/15/2020', 'A', 'Contaco', '1', 'Definitely', '2'),
('10/15/2020', 'A', 'Contaco', '1', 'Probably', '3'),
('10/15/2020', 'A', 'Contaco', '1', 'Maybe', '2'),
('10/1/2020', 'B', 'Contaco', '1', 'N/A', '1'),
('10/1/2020', 'B', 'Contaco', '1', 'Definitely not', '4'),
('10/1/2020', 'B', 'Contaco', '1', 'Definitely', '2'),
('10/1/2020', 'B', 'Contaco', '1', 'Maybe', '1'),
('10/8/2020', 'B', 'Contaco', '1', 'N/A', '3'),
('10/8/2020', 'B', 'Contaco', '1', 'Definitely', '1'),
('10/8/2020', 'B', 'Contaco', '1', 'Probably', '2'),
('10/8/2020', 'B', 'Contaco', '1', 'Maybe', '1'),
('10/15/2020', 'B', 'Contaco', '1', 'N/A', '2'),
('10/15/2020', 'B', 'Contaco', '1', 'Definitely not', '1'),
('10/15/2020', 'B', 'Contaco', '1', 'Definitely', '2'),
('10/15/2020', 'B', 'Contaco', '1', 'Maybe', '2') ;
当前查询
Select week, type, movie, question, answer, value,
LAG(value, 1, 0) OVER (PARTITION BY movie, question, answer, type ORDER BY movie, type, week ASC) AS one_week_prior_value,
LAG(value, 2, 0) OVER (PARTITION BY movie, question, answer, type ORDER BY movie, type, week ASC) AS two_week_prior_value
from sample_table ;
使用此查询 - 我正在尝试使用滞后函数为相同类型、电影、问题和答案导出“一周前值”和“两周前值”的值。它非常适用于 Type = A 时,因为每个问题的答案都在每周的数据中。
问题是当 Type = B 时,每周所有“答案”选项都不可用。 lag 函数查找上一个最非空值,或者它不为不存在的“答案”值提供当前周的值。下面的例子
两个问题:
-
2020 年 10 月 15 日的“一周前值”的“绝对没有”行应该是 0 而不是 4,因为前一周没有任何“绝对没有”的值
-
2020 年 10 月 15 日应该有一行表示“可能”,0 表示“值”,因为它没有该周的值,但有前 2 周的值。
+--------------------------+------+---------+----------+----------------+-------+----------------------+----------------------+
| Month, Day, Year of Week | Type | Movie | Question | Answer | Value | One Week Prior Value | Two Week Prior Value |
+--------------------------+------+---------+----------+----------------+-------+----------------------+----------------------+
| 1-Oct-20 | A | Contaco | 1 | Definitely | 2 | 0 | 0 |
| 1-Oct-20 | A | Contaco | 1 | Definitely not | 4 | 0 | 0 |
| 1-Oct-20 | A | Contaco | 1 | Maybe | 1 | 0 | 0 |
| 1-Oct-20 | A | Contaco | 1 | N/A | 1 | 0 | 0 |
| 1-Oct-20 | A | Contaco | 1 | Probably | 2 | 0 | 0 |
| 8-Oct-20 | A | Contaco | 1 | Definitely | 2 | 2 | 0 |
| 8-Oct-20 | A | Contaco | 1 | Definitely not | 1 | 4 | 0 |
| 8-Oct-20 | A | Contaco | 1 | Maybe | 1 | 1 | 0 |
| 8-Oct-20 | A | Contaco | 1 | N/A | 3 | 1 | 0 |
| 8-Oct-20 | A | Contaco | 1 | Probably | 4 | 2 | 0 |
| 15-Oct-20 | A | Contaco | 1 | Definitely | 2 | 2 | 2 |
| 15-Oct-20 | A | Contaco | 1 | Definitely not | 1 | 1 | 4 |
| 15-Oct-20 | A | Contaco | 1 | Maybe | 2 | 1 | 1 |
| 15-Oct-20 | A | Contaco | 1 | N/A | 2 | 3 | 1 |
| 15-Oct-20 | A | Contaco | 1 | Probably | 3 | 4 | 2 |
| 1-Oct-20 | B | Contaco | 1 | Definitely | 2 | 0 | 0 |
| 1-Oct-20 | B | Contaco | 1 | Definitely not | 4 | 0 | 0 |
| 1-Oct-20 | B | Contaco | 1 | Maybe | 1 | 0 | 0 |
| 1-Oct-20 | B | Contaco | 1 | N/A | 1 | 0 | 0 |
| 8-Oct-20 | B | Contaco | 1 | Definitely | 1 | 2 | 0 |
| 8-Oct-20 | B | Contaco | 1 | Maybe | 1 | 1 | 0 |
| 8-Oct-20 | B | Contaco | 1 | N/A | 3 | 1 | 0 |
| 8-Oct-20 | B | Contaco | 1 | Probably | 2 | 0 | 0 |
| 15-Oct-20 | B | Contaco | 1 | Definitely | 2 | 1 | 2 |
| 15-Oct-20 | B | Contaco | 1 | Definitely not | 1 | 4 | 0 |
| 15-Oct-20 | B | Contaco | 1 | Maybe | 2 | 1 | 1 |
| 15-Oct-20 | B | Contaco | 1 | N/A | 2 | 3 | 1 |
+--------------------------+------+---------+----------+----------------+-------+----------------------+----------------------+
这就是我理想的输出应该是什么样子。关于如何使用给定的可用数据实现这一点的任何建议?我花了一段时间才发布这篇文章,所以希望它是值得的!提前谢谢你
- 您可以看到,对于 2020 年 10 月 15 日 - “绝对不是”的前一周值是 0 而不是 4
- 您可以看到 2020 年 10 月 15 日 - “可能”的值为 0
+------------------+------+-----------+----------+----------------+-------+------------------+--------------------+
| Week | Type | Movie | Question | Answer | value | prior week value | 2 week prior value |
+------------------+------+-----------+----------+----------------+-------+------------------+--------------------+
| October 1, 2020 | A | Contaco| 1 | N/A | 1.000 | 0.000 | 0.000 |
| October 1, 2020 | A | Contaco| 1 | Definitely not | 4.000 | 0.000 | 0.000 |
| October 1, 2020 | A | Contaco| 1 | Definitely | 2.000 | 0.000 | 0.000 |
| October 1, 2020 | A | Contaco| 1 | Probably | 2.000 | 0.000 | 0.000 |
| October 1, 2020 | A | Contaco| 1 | Maybe | 1.000 | 0.000 | 0.000 |
| October 8, 2020 | A | Contaco| 1 | N/A | 3.000 | 1.000 | 0.000 |
| October 8, 2020 | A | Contaco| 1 | Definitely not | 1.000 | 4.000 | 0.000 |
| October 8, 2020 | A | Contaco| 1 | Definitely | 2.000 | 2.000 | 0.000 |
| October 8, 2020 | A | Contaco| 1 | Probably | 4.000 | 2.000 | 0.000 |
| October 8, 2020 | A | Contaco| 1 | Maybe | 1.000 | 1.000 | 0.000 |
| October 15, 2020 | A | Contaco| 1 | N/A | 2.000 | 3.000 | 1.000 |
| October 15, 2020 | A | Contaco| 1 | Definitely not | 1.000 | 4.000 | 4.000 |
| October 15, 2020 | A | Contaco| 1 | Definitely | 2.000 | 2.000 | 2.000 |
| October 15, 2020 | A | Contaco| 1 | Probably | 3.000 | 4.000 | 2.000 |
| October 15, 2020 | A | Contaco| 1 | Maybe | 2.000 | 1.000 | 1.000 |
| October 1, 2020 | B | Contaco| 1 | N/A | 1.000 | 0.000 | 0.000 |
| October 1, 2020 | B | Contaco| 1 | Definitely not | 4.000 | 0.000 | 0.000 |
| October 1, 2020 | B | Contaco| 1 | Definitely | 2.000 | 0.000 | 0.000 |
| October 1, 2020 | B | Contaco| 1 | Probably | 0.000 | 0.000 | 0.000 |
| October 1, 2020 | B | Contaco| 1 | Maybe | 1.000 | 0.000 | 0.000 |
| October 8, 2020 | B | Contaco| 1 | N/A | 3.000 | 1.000 | 0.000 |
| October 8, 2020 | B | Contaco| 1 | Definitely not | 0.000 | 4.000 | 0.000 |
| October 8, 2020 | B | Contaco| 1 | Definitely | 2.000 | 2.000 | 0.000 |
| October 8, 2020 | B | Contaco| 1 | Probably | 4.000 | 0.000 | 0.000 |
| October 8, 2020 | B | Contaco| 1 | Maybe | 1.000 | 1.000 | 0.000 |
| October 15, 2020 | B | Contaco| 1 | N/A | 2.000 | 3.000 | 1.000 |
| October 15, 2020 | B | Contaco| 1 | Definitely not | 1.000 | 0.000 | 4.000 |
| October 15, 2020 | B | Contaco| 1 | Definitely | 2.000 | 2.000 | 2.000 |
| October 15, 2020 | B | Contaco| 1 | Probably | 0.000 | 4.000 | 0.000 |
| October 15, 2020 | B | Contaco| 1 | Maybe | 2.000 | 1.000 | 1.000 |
+------------------+------+-----------+----------+----------------+-------+------------------+--------------------+
【问题讨论】:
标签: sql padding snowflake-cloud-data-platform window-functions lag