Saya dapat menghitung waktu antara transaksi pertama dan terakhir untuk setiap pelanggan (lihat kode di bawah).

SELECT customer_id, max(order_time) - min(order_time) as days_from_first_to_last_order,
 (case when count(*) > 1
             then datediff(day, min(order_time), max(order_time)) / (count(*) - 1)
        end) as avg_time
FROM ORDERS
group by customer_id

Bagaimana saya bisa memperpanjang ini untuk menjawab pertanyaan: berapa waktu rata-rata antara transaksi pertama dan terakhir untuk pelanggan saya?

0
lcasucci 9 Januari 2020, 23:44

2 jawaban

Jawaban Terbaik

Cukup tambahkan satu tingkat agregasi:

SELECT AVG(avg_time) avg_time
FROM (
    SELECT 
        CASE 
            WHEN COUNT(*) > 1 
            THEN datediff(day, min(order_time), max(order_time)) / (count() - 1) 
        END as avg_time 
    FROM orders
    GROUP BY customer_id
) t

Catatan:

  • anda hanya perlu kolom avg_time di subquery untuk mendapatkan hasil yang diharapkan jadi saya menghapus yang lain; ini berarti lebih sedikit komputasi agregasi untuk RDBMS Anda

  • tanda kurung di sekitar ekspresi case berlebihan

1
GMB 9 Januari 2020, 22:56

Anda dapat menggunakan agregasi tingkat kedua:

SELECT AVG(avg_time * 1.0)
FROM (SELECT customer_id, max(order_time) - min(order_time) as days_from_first_to_last_order, (case when count() > 1 then 
             datediff(day, min(order_time), max(order_time)) / nullif(count() - 1, 0)  as avg_time
      FROM ORDERS
      GROUP BY customer_id
     ) c

Anda akan melihat bahwa saya menyederhanakan subquery dengan menggunakan nullif().

1
Gordon Linoff 9 Januari 2020, 20:46