Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mencari Aktiviti Seterusnya Kumpulan B Mengikuti Aktiviti Kumpulan A dalam PostgreSQL?

Bagaimana untuk Mencari Aktiviti Seterusnya Kumpulan B Mengikuti Aktiviti Kumpulan A dalam PostgreSQL?

Barbara Streisand
Lepaskan: 2025-01-01 07:17:08
asal
1000 orang telah melayarinya

How to Find the Next Activity of Group B Following Group A Activities in PostgreSQL?

Fungsi Lead/Lag Bersyarat dalam PostgreSQL

Anda cuba mengenal pasti aktiviti seterusnya yang dilakukan oleh pengguna yang tergolong dalam kumpulan B, selepas mereka telah menyelesaikan aktiviti daripada kumpulan A. Pada asasnya, anda perlu mencari aktiviti seterusnya yang pertama daripada kumpulan B untuk setiap pengguna.

Satu pendekatan ialah menggunakan fungsi tetingkap bersyarat. Walau bagaimanapun, dalam PostgreSQL, klausa FILTER hanya boleh digunakan pada fungsi agregat dalam fungsi tetingkap, bukan kepada fungsi tetingkap teras seperti lead() atau lag().

Oleh itu, penyelesaian yang berdaya maju adalah menggunakan binaan DISTINCT ON bersama CASE dan fungsi tetingkap:

SELECT name
     , CASE WHEN a2 LIKE 'B%' THEN a1 ELSE a2 END AS activity
     , CASE WHEN a2 LIKE 'B%' THEN a2 END AS next_activity
FROM  (
   SELECT DISTINCT ON (name)
          name
        , lead(activity) OVER (PARTITION BY name ORDER BY time DESC) AS a1
        , activity AS a2
   FROM   t
   WHERE (activity LIKE 'A%' OR activity LIKE 'B%')
   ORDER  BY name, time DESC
   ) sub;
Salin selepas log masuk

Pertanyaan ini menggunakan subkueri kepada:

  1. Gunakan DISTINCT ON (nama) untuk mengenal pasti aktiviti terkini (a1) daripada kumpulan A untuk setiap pengguna.
  2. Gunakan lead() untuk mendapatkan aktiviti seterusnya (a2) untuk setiap baris.
  3. Gunakan CASE dan LIKE 'B%' untuk mengesan dan menetapkan aktiviti seterusnya jika ia tergolong dalam kumpulan B.

Sebagai alternatif, untuk set data kecil dengan bilangan baris yang terhad bagi setiap pengguna, pertanyaan berikut boleh digunakan:

SELECT name
     , activity AS a1
     , lead(activity) OVER (PARTITION BY name ORDER BY time DESC) AS next_activity
FROM   t
WHERE (activity LIKE 'A%' OR activity LIKE 'B%')
ORDER  BY name, time DESC;
Salin selepas log masuk

Pertanyaan ini memudahkan logik dengan mencari terus aktiviti kumpulan A dan mendapatkan semula aktiviti seterusnya, tanpa mengira gabungan kumpulannya.

Atas ialah kandungan terperinci Bagaimana untuk Mencari Aktiviti Seterusnya Kumpulan B Mengikuti Aktiviti Kumpulan A dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan