我正在对多个记录执行聚合函数,这些记录按公共ID分组。问题是,我还希望导出某些其他字段,这些字段在分组记录中可能不同,但我希望从其中一个记录(第一个记录,根据查询的顺序)中获取这些特定字段。
起点示例:
SELECT
customer_id,
sum(order_total),
referral_code
FROM order
GROUP BY customer_id
ORDER BY date_created
我需要查询转介代码,但在聚合函数之外执行这项操作意味着我也必须按该字段分组,这不是我想要的-在本例中,每个客户只需要一行。我真的只关心第一个订单的转介码,我很高兴能扔掉以后的转介码。
这是在PostgreSQL中,但其他DBs的语法可能很相似,足以工作。
拒绝的解决方案:
无法使用max()或min(),因为顺序很重要。
子查询一开始可能可以工作,但不能扩展;这是一个非常简单的示例。我的实际查询有几十个字段,比如referrion_code,我只想要它的第一个实例,还有几十个WHERE子句,如果在子查询中重复,会造成维护的噩梦。
最佳答案
其实很简单。
首先,让我们编写一个执行聚合的查询:
select customer_id, sum(order_total)
from order
group by customer_id
现在,我们编写一个查询,返回为给定客户id创建的第一个转介代码和日期:
select distinct on (customer_id) customer_id, date_created, referral_code
from order
order by customer_id, date_created
现在,您只需加入两个选择:
select
x1.customer_id,
x1.sum,
x2.date_created,
x2.referral_code
from
(
select customer_id, sum(order_total)
from order
group by customer_id
) as x1
join
(
select distinct on (customer_id) customer_id, date_Created, referral_code
from order
order by customer_id, date_created
) as x2 using ( customer_id )
order by x2.date_created
我没有测试它,所以它可能有错别字,但总的来说应该可以工作。
关于sql - 对相关记录进行分组,但仅从第一条记录中选择某些字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/821811/