2016-05-03 8 views
2

テーブル「Sales」を持つ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?」をテストしてみたが、それはうまくいきませんでした。

答えて

1

によりSALESグループからCUSTOMERID分(DTHRSALE)を選択Firebirdの2.5では、あなたが次のクエリでこれを行うことができます。私はちょうどあなたの質問に示すように、それは順序を与える作るためにこれを追加し、

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は必要ありません:これはあなたのスキーマと要件に合わせて調整the accepted answer of the question you linked toの第二部の軽微な変更です。

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 

はそれが速く作るためにインデックスを超える(得意先、dthrsale)を定義します。