gpt4 book ai didi

sql - 如何在一次表扫描中组合不同时间范围的多个查询

转载 作者:行者123 更新时间:2023-11-29 13:03:50 25 4
gpt4 key购买 nike

我有一个大表(数百万行),其中包含花费的统计信息。

表定义: 供应商编号, 花费, 日期

大多数供应商每月工作一次,因此我可以进行单月花费查询以获取他们在该月的这段时间的花费。

select provider_id,sum(spent) from spent_table where date >= '20131201' group by 1;

但是有些供应商不按月工作,所以我需要让他们在自定义期间内消费。为了让所有自定义提供者花费我做联合查询:

select provider_id,sum(spent) from spent_table where date between '20130930' and '20140101' and provider_id = 272 group by 1  
union
select provider_id,sum(spent) from spent_table where date between '20130730' and '20131201' and provider_id = 273 group by 1

每个选择都进行索引扫描,但我有 50 个自定义提供程序,因此联合查询执行为 50 个索引扫描查询。为了在单次扫描中执行此操作,我可以做些什么吗?

计划是:

HashAggregate  (cost=122297336.47..122297337.03 rows=56 width=12)
-> Append (cost=0.00..122297336.19 rows=56 width=12)
-> GroupAggregate (cost=0.00..2428542.88 rows=1 width=12)
-> Index Scan using date_idx on spent_table (cost=0.00..2428448.33 rows=18908 width=12)
Index Cond: ((provider_id = 272) AND (date >= '2013-09-30 00:00:00'::timestamp without time zone) AND (date < '2014-01-01 00:00:00'::timestamp without time zone))
-> GroupAggregate (cost=0.00..2428542.88 rows=1 width=12)
-> Index Scan using date_idx on spent_table (cost=0.00..2428448.33 rows=18908 width=12)
Index Cond: ((provider_id = 262) AND (date >= '2013-09-30 00:00:00'::timestamp without time zone) AND (date < '2014-01-01 00:00:00'::timestamp without time zone))

谢谢

最佳答案

您始终按 provider_id 进行分组,并且每个查询在其 WHERE 子句中都有不同的 provider_id。这意味着您可以确定每个查询的结果是离散的,您可以简单地将所有条件组合到一个带有 ORWHERE 子句中>小号:

SELECT   provider_id, sum(spent)
FROM spent_table
WHERE (date BETWEEN '20130930' AND '20140101' AND provider_id = 272) OR
(date BETWEEN '20130730' AND '20131201' AND provider_id = 273)
GROUP BY provider_id

关于sql - 如何在一次表扫描中组合不同时间范围的多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20773801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com