【问题标题】:Better way to do distinct rollup in redshift?在红移中进行不同汇总的更好方法?
【发布时间】:2020-08-04 03:15:58
【问题描述】:

编写一个查询的最佳方法是在 redshift 上对不同离散时间范围内的不同计数进行汇总?

例如,如果您为各个组织的潜在客户收集了一些电话号码,并想了解每周、每月、每季度等创建了多少不同的电话号码......最好的方法是什么?

这是我能想到的最好的:

SELECT
  organization,
  sum(weekly) as weekly,
  sum(monthly) as monthly,
  sum(quarterly) as quarterly,
  sum(yearly) as yearly
FROM (
    SELECT 
      organization,
      COUNT(DISTINCT phoneNumber) as weekly,
      null as monthly,
      null as quarterly,
      null as yearly
    FROM Lead
    WHERE createdAt >= current_date - interval '7 days'
    GROUP BY organization

      UNION ALL

    SELECT
      organization,
      null as weekly,
      COUNT(DISTINCT phoneNumber) as monthly,
      null as quarterly,
      null as yearly
    FROM Lead
    WHERE createdAt >= current_date - interval '1 month'
    GROUP BY organization

        UNION ALL

    SELECT
      organization,
      null as weekly,
      null as monthly,
      COUNT(DISTINCT phoneNumber) as quarterly,
      null as yearly
    FROM Lead
    WHERE createdAt >= current_date - interval '3 months'
    GROUP BY organization

        UNION ALL

    SELECT
      organization,
      null as weekly,
      null as monthly,
      null as quarterly,
      COUNT(DISTINCT phoneNumber) as yearly
    FROM Lead
    WHERE createdAt >= current_date - interval '1 year'
    GROUP BY organization
) GROUP BY organization

有什么方法可以让查询更快/更容易理解?

【问题讨论】:

  • 样本数据和期望的结果将更有可能回答您的问题。

标签: sql amazon-redshift distinct rollup


【解决方案1】:

如果我理解正确,您只需使用条件聚合:

SELECT organization,
       COUNT(DISTINCT CASE WHEN created_at >= current_date - interval '7 day' THEN phoneNumber END) as weekly,
       COUNT(DISTINCT CASE WHEN created_at >= current_date - interval '1 month' THEN phoneNumber END) as monthly,
       COUNT(DISTINCT CASE WHEN created_at >= current_date - interval '3 month' THEN phoneNumber END) as quarterly,
       COUNT(DISTINCT CASE WHEN created_at >= current_date - interval '1 year' THEN phoneNumber END) as yearly
FROM Lead
WHERE createdAt >= current_date - interval '1 year'
GROUP BY organization;

【讨论】:

  • 那太好了,让我试试看是否得到相同的结果
  • 太棒了,唯一需要更改的是 CASE WHEN 需要一个布尔值来决定是否返回 then 所以我将该位更改为“CASE WHEN createdAt >= current_date - 间隔。 ..”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2013-12-09
相关资源
最近更新 更多