Pertanyaan Pilih pembelian pertama untuk setiap pelanggan


Kami mencoba memilih pembelian pertama untuk setiap pelanggan dalam tabel yang serupa dengan ini:

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

Hasil yang diharapkan dari kueri yang kami coba capai adalah:

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

Yang paling dekat yang kami miliki adalah pertanyaan berikut:

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

Dengan hasil sebagai berikut:

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

Tetapi ketika kami memilih sisa dari bidang yang dibutuhkan kami jelas harus menambahkannya ke klausa GROUP BY yang akan membuat hasil dari MIN berbeda. Kami juga mencoba untuk bergabung dengan itu sendiri, tetapi belum membuat kemajuan.

Bagaimana kita mendapatkan sisa nilai yang terkorelasi tanpa membuat fungsi agregat menjadi kacau?


5
2017-11-06 01:53


asal


Jawaban:


Anda dapat memperlakukan kueri yang Anda temukan sebagai kueri internal. Ini akan bekerja pada versi SQL Server yang lebih lama juga (Anda tidak menentukan versi 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

5
2017-11-06 02:04



SELECT 
    transaction_no,
    customer_id,
    operator_id,
    purchase_date
FROM
(SELECT 
    *,
    ROW_NUMBER () OVER ( [ PARTITION BY customer_id order by purchase_date ) "occurence"
    FROM Sales_Transactions_Header
)
WHERE occurence = 1

2
2017-11-06 02:05



Kedengarannya seperti pekerjaan untuk CTE!

Clicky!

CTE akan memungkinkan Anda untuk mendapatkan tanggal pembelian paling awal untuk setiap pelanggan. Kemudian Anda bergabung kembali ke tabel asli Anda di customer_id dan tanggal, mendapatkan sisa informasi untuk transaksi itu.

Seperti ini:

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

1
2017-11-06 02:03