Firebird Query-返回每组的第一行

时间:2016-05-03 20:42:58

标签: sql firebird greatest-n-per-group firebird2.5

在带有“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?”,但它没有用。

3 个答案:

答案 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)