在红移中进行不同汇总的更好方法?
Better way to do distinct rollup in redshift?
编写在 redshift 上对不同离散时间范围内的不同计数进行汇总的查询的最佳方法是什么?
例如,如果您为各种组织中的潜在客户收集了一些 phone 号码,并且想要了解每周、每月、每季度等创建了多少不同的 phone 号码...最好的方法是什么?
这是我能想到的最好的:
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
有什么方法可以使查询更快/更容易理解?
如果我没理解错的话,你只需要使用条件聚合:
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;
编写在 redshift 上对不同离散时间范围内的不同计数进行汇总的查询的最佳方法是什么?
例如,如果您为各种组织中的潜在客户收集了一些 phone 号码,并且想要了解每周、每月、每季度等创建了多少不同的 phone 号码...最好的方法是什么?
这是我能想到的最好的:
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
有什么方法可以使查询更快/更容易理解?
如果我没理解错的话,你只需要使用条件聚合:
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;