在带有“Sales”表的firebird数据库中,我需要选择所有客户的第一笔销售。请参阅下面显示该表和所需查询结果的示例。
---------------------------------------
SALES
---------------------------------------
ID CUSTOMERID DTHRSALE
1 25 01/04/16 09:32
2 30 02/04/16 11:22
3 25 05/04/16 08:10
4 31 07/03/16 10:22
5 22 01/02/16 12:30
6 22 10/01/16 08:45
结果:仅根据销售日期进行首次销售。
ID CUSTOMERID DTHRSALE
1 25 01/04/16 09:32
2 30 02/04/16 11:22
4 31 07/03/16 10:22
6 22 10/01/16 08:45
我已经测试了以下代码“Select first row in each GROUP BY group?”,但它没有用。
答案 0 :(得分:1)
在Firebird 2.5中,您可以使用以下查询执行此操作;这是根据您的架构和要求量身定制的the accepted answer of the question you linked to第二部分的一个小修改:
select x.id,
x.customerid,
x.dthrsale
from sales x
join (select customerid,
min(dthrsale) as first_sale
from sales
group by customerid) p on p.customerid = x.customerid
and p.first_sale = x.dthrsale
order by x.id
order by
不是必需的,我只是添加了它,以便按照您的问题显示订单。
使用Firebird 3,您可以使用窗口函数ROW_NUMBER
,该函数也在链接的答案中进行了描述。链接的答案错误地说第一个解决方案适用于Firebird 2.1及更高版本。我现在已经编辑了它。
答案 1 :(得分:0)
搜索没有早期销售的销售:
SELECT S1.*
FROM SALES S1
LEFT JOIN SALES S2 ON S2.CUSTOMERID = S1.CUSTOMERID AND S2.DTHRSALE < S1.DTHRSALE
WHERE S2.ID IS NULL
在(customerid,dthrsale)上定义索引以使其快速。
答案 2 :(得分:-1)
如此简单:
通过CUSTOMERID从SALES组中选择CUSTOMERID min(DTHRSALE)