假设我有一个像下面这样的表:
| 身份证|起始值|终值|日期|价值|
| --------------|--------------|--------------|--------------|--------------|
| 1|零|零|23年4月5日|二|
| 1|零|五|23年4月9日|零|
| 1|五|零|23年4月15日|零|
| 1|零|零|2023年4月16日|四|
| 1|零|零|2023年4月16日|-1|
| 1|零|八个|2023年4月16日|零|
| 二|1|零|23年4月5日|零|
| 二|零|九|23年4月9日|零|
| 二|九|零|2023年4月13日|零|
| 二|零|零|2023年4月13日|1|
| 二|零|零|23年4月14日|-5|
| 二|零|零|23年4月15日|-3|
| 二|零|零|2023年4月16日|-4个|
| 二|零|-1|2023年4月16日|零|
我问a question before,可以得到最新的非空开始和结束值的id如下与SQL:
SELECT id,
start_value,
end_value,
start_date,
end_date
FROM (
SELECT id,
LAST_VALUE(start_value)
IGNORE NULLS OVER (PARTITION BY id ORDER BY "DATE") AS start_value,
LAST_VALUE(end_value)
IGNORE NULLS OVER (PARTITION BY id ORDER BY "DATE") AS end_value,
LAST_VALUE(CASE WHEN start_value IS NOT NULL THEN "DATE" END)
IGNORE NULLS OVER (PARTITION BY id ORDER BY "DATE") AS start_date,
LAST_VALUE(CASE WHEN end_value IS NOT NULL THEN "DATE" END)
IGNORE NULLS OVER (PARTITION BY id ORDER BY "DATE") AS end_date,
ROW_NUMBER()
OVER (PARTITION BY id ORDER BY "DATE" DESC) AS rn
FROM table_name
)
WHERE rn = 1
身份证 | 起始值 | 终值 | 开始日期 | 结束日期 |
---|---|---|---|---|
1 | 五 | 八个 | 23年4月15日 | 2023年4月16日 |
二 | 九 | -1 | 2023年4月13日 | 2023年4月16日 |
现在,我想获得一个ID的最新非空开始和结束日期之间的中间值,如下所示,但不知道如何做到这一点:
| 身份证|起始值|终值|日期|价值|
| --------------|--------------|--------------|--------------|--------------|
| 1|五|零|23年4月15日|零|
| 1|零|零|23年4月15日|四|
| 1|零|零|2023年4月16日|-1|
| 1|零|八个|2023年4月16日|零|
| 二|九|零|2023年4月13日|零|
| 二|零|零|2023年4月13日|1|
| 二|零|零|23年4月14日|-5|
| 二|零|零|23年4月15日|-3|
| 二|零|零|2023年4月16日|-4个|
| 二|零|-1|2023年4月16日|零|
3条答案
按热度按时间xzabzqsa1#
在整个结果集上用一个窗口查找开始和结束日期的
LAST_VALUE
,然后对其进行过滤:其中,对于样本数据:
输出:
| ID|开始值|END_VALUE|日期|价值|
| --------------|--------------|--------------|--------------|--------------|
| 1|五|联系我们|2019 -04-15 00:00:00|联系我们|
| 1|联系我们|联系我们|2019 -04-16 00:00:00|-4个|
| 1|联系我们|联系我们|2019 -04-16 00:00:00|-1|
| 1|联系我们|八个|2019 -04-16 00:00:00|联系我们|
| 二|九|联系我们|2019 -04-13 00:00:00|联系我们|
| 二|联系我们|联系我们|2019 -04-13 00:00:00|1|
| 二|联系我们|联系我们|2019 -04-14 00:00:00|-5|
| 二|联系我们|联系我们|2019 -04-15 00:00:00|-3|
| 二|联系我们|联系我们|2019 -04-16 00:00:00|-4个|
| 二|联系我们|-1|2019 -04-16 00:00:00|联系我们|
fiddle
kxxlusnw2#
您可以计算每个id的非空start_value值的数量,然后使用
DENSE_RANK
对每个id的计数进行排名。一旦你有了,你可以使用rank = 1,就像你以前的文章一样。输出:
检查演示here。
如果您不介意输出行的顺序,另一种选择是使用
FETCH FIRST 1 ROWS WITH TIES
子句。jaxagkaj3#
可以使用查询来完成,该查询获取
cte
中最新的非空开始值和结束值,然后将其连接到表中,如下所示:结果:
| 身份证|起始值|终值|日期|价值|
| --------------|--------------|--------------|--------------|--------------|
| 1|五|零|23年4月15日|零|
| 1|零|零|23年4月15日|四|
| 1|零|零|2023年4月16日|-1|
| 1|零|八个|2023年4月16日|零|
| 二|九|零|2023年4月13日|零|
| 二|零|零|2023年4月13日|1|
| 二|零|零|23年4月14日|-5|
| 二|零|零|23年4月15日|-3|
| 二|零|零|2023年4月16日|-4个|
| 二|零|-1|2023年4月16日|零|
Demo here