11

次のようなテーブルで、各顧客の最初の購入を選択しようとしています。

transaction_no  customer_id  operator_id  purchase_date
20503           1            5            2012-08-24
20504           1            7            2013-10-15
20505           2            5            2013-09-05
20506           3            7            2010-09-06
20507           3            7            2012-07-30

達成しようとしているクエリから期待される結果は次のとおりです。

transaction_no  customer_id  operator_id  first_occurence
20503           1            5            2012-08-24
20505           2            5            2013-09-05
20506           3            7            2010-09-06

最も近いのは次のクエリです。

SELECT customer_id, MIN(purchase_date) As first_occurence
FROM Sales_Transactions_Header
GROUP BY customer_id;

次の結果が得られます。

customer_id  first_occurence
1            2012-08-24
2            2013-09-05
3            2010-09-06

しかし、残りの必要なフィールドを選択するときは、それらを GROUP BY 句に追加する必要があります。これにより、MIN からの結果が異なります。また、それ自体に参加しようとしましたが、何の進展もありませんでした。

集計関数を混乱させずに残りの相関値を取得するにはどうすればよいでしょうか?

4

4 に答える 4

11

思いついたクエリを単純に内部クエリとして扱うことができます。これは、古いバージョンの SQL Server でも機能します (SQL Server のバージョンを指定しませんでした)。

SELECT H.transaction_no, H.customer_id, H.operator_id, H.purchase_date
FROM Sales_Transactions_Header H
INNER JOIN
    (SELECT customer_id, MIN(purchase_date) As first_occurence
    FROM Sales_Transactions_Header
    GROUP BY customer_id) X
ON H.customer_id = X.customer_id AND H.purchase_date = X.first_occurence
于 2013-11-06T02:04:25.940 に答える
7

ROW_NUMBER関数を使用すると、それを支援できます。

これは、あなたのケースでそれを行う方法です。

WITH Occurences AS 
(
    SELECT 
        *,
        ROW_NUMBER () OVER (PARTITION BY customer_id order by purchase_date ) AS "Occurence"            
    FROM Sales_Transactions_Header
)
SELECT 
    transaction_no,
    customer_id,
    operator_id,
    purchase_date
FROM Occurences 
WHERE Occurence = 1
于 2013-11-06T02:05:33.807 に答える
3

CTEの仕事のようですね!

カチカチ!

CTE により、各顧客の最も早い購入日を取得できます。次に、customer_id と日付で元のテーブルに結合し、そのトランザクションの残りの情報を取得します。

そのようです:

with first_date as(
  select customer_id,
  min(purchase_date) as first_purchase
  from
  table1
  group by
  customer_id
)
select
t1.transaction_no,
t1.customer_id,
t1.operator_id,
t1.purchase_date
from
table1 t1
inner join first_date
on
purchase_date = first_purchase
and t1.customer_id = first_date.customer_id
于 2013-11-06T02:03:32.590 に答える