首页 > 解决方案 > 如果使用 SQL 存在数据,如何将“计划”替换为“实际”

问题描述

我有一张看起来像这样的桌子。

它看起来像什么:

日期 电影 地点 类型 意见
2020 年 11 月 19 日 超人 纽约 计划
2020 年 11 月 26 日 超人 纽约 计划 35
2020 年 12 月 3 日 超人 纽约 计划 20
2020 年 12 月 10 日 超人 纽约 计划 20
2020 年 12 月 10 日 超人 纽约 实际数据 45
2020 年 12 月 17 日 超人 纽约 计划 30
2020 年 12 月 17 日 超人 纽约 实际数据 53
2020 年 12 月 24 日 超人 纽约 计划 40
2020 年 12 月 24 日 超人 纽约 实际数据 55
2020 年 12 月 31 日 超人 纽约 计划 40
2020 年 12 月 31 日 超人 纽约 实际数据 64
2021 年 1 月 7 日 超人 纽约 计划 70
2021 年 1 月 7 日 超人 纽约 实际数据 75
2021 年 1 月 14 日 超人 纽约 计划 30
2021 年 1 月 14 日 超人 纽约 实际数据 54
2021 年 1 月 21 日 超人 纽约 计划 10
2021 年 1 月 21 日 超人 纽约 实际数据 15
2021 年 1 月 28 日 超人 纽约 计划 10
2021 年 1 月 28 日 超人 纽约 实际数据
2021 年 2 月 4 日 超人 纽约 计划 14

如果实际值不存在,我只想包括计划。我应该尝试什么?实际值行可能存在但带有 0。它应该仅在该值大于 0 时显示实际值

预期的:

日期 电影 地点 类型 意见
2020 年 11 月 19 日 超人 纽约 计划
2020 年 11 月 26 日 超人 纽约 计划 35
2020 年 12 月 3 日 超人 纽约 计划 20
2020 年 12 月 10 日 超人 纽约 实际数据 45
2020 年 12 月 17 日 超人 纽约 实际数据 53
2020 年 12 月 24 日 超人 纽约 实际数据 55
2020 年 12 月 31 日 超人 纽约 实际数据 64
2021 年 1 月 7 日 超人 纽约 实际数据 75
2021 年 1 月 14 日 超人 纽约 实际数据 54
2021 年 1 月 21 日 超人 纽约 实际数据 15
2021 年 1 月 28 日 超人 纽约 计划 10
2021 年 2 月 4 日 超人 纽约 计划 14

标签: sqlfilteringsnowflake-cloud-data-platform

解决方案


一种方法是not exists

select t.*
from t
where t.type = 'Actuals' or
      not exists (select 1
                  from t t2
                  where t2.date = t.date and
                        t2.movie = t.movie and
                        t2.location = t.location and
                        t2.type = 'Actuals'
                 );

一个有趣的方法是使用聚合:

select date, movie, location,
       coalesce( max(case when type = 'Actuals' then type end),
                 max(type)
               ) as type,
       coalesce( max(case when type = 'Actuals' then views end),
                 max(views)
               ) as views
from t
group by date, movie, location;

但最常见的方法是使用qualify窗口函数:

select t.*
from t
qualify row_number() over (partition by date, movie, location
                           order by type
                          ) = 1;

注意:排序是按字母顺序排列的'Actuals' < 'Planned'


推荐阅读