2016-05-03 80 views
2

在一個帶有「銷售」表的Firebird數據庫中,我需要選擇所有客戶的第一個銷售。請參閱下面的示例,其中顯示了表和所需的查詢結果。Firebird Query-每組返回第一行

--------------------------------------- 
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?」,但沒有奏效。

回答

-2

所以簡單爲:從SALES組由CUSTOMERID

選擇CUSTOMERID分鐘(DTHRSALE)

1

在火鳥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及更高版本上運行。我現在編輯它。

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 

定義一個指數超過(客戶ID,dthrsale),使之快。