SQL Lag

Sql Lag



Fungsi SQL lag() membolehkan anda mengakses baris sebelumnya dari baris semasa pada offset tertentu. Ringkasnya, fungsi lag() membolehkan anda mengakses baris sebelumnya daripada baris semasa. Dengan menentukan nilai offset, anda boleh mengakses baris 1, 2, 3, dsb., sebelumnya daripada baris semasa.

Ia adalah bertentangan dengan fungsi lead() yang membolehkan anda mengakses baris berikutnya.







SQL Lag()

Sintaks fungsi adalah seperti berikut:



LAG(ungkapan_nilai, mengimbangi [, lalai])
LEBIH (
[PARTITION BY partition_expression]
ORDER BY sort_expression [ASC | DESC]
);

Berikut adalah hujah yang disokong:



  • nilai_ungkapan – Ia menentukan nilai pulangan baris sebelumnya. Ungkapan mesti menilai kepada satu nilai.
  • mengimbangi – Ia menentukan bilangan baris ke belakang dari baris semasa untuk diakses.
  • lalai – Ia menetapkan nilai lalai jika offset berada di luar skop partition. Secara lalai, nilai ditetapkan kepada NULL.
  • Pembahagian oleh – Ia menentukan cara membahagikan data.
  • Perintah oleh – Ia menetapkan format pesanan untuk baris dalam setiap partition.

Contoh Persediaan Data

Sebelum kita menyelami cara kerja fungsi lag(), mari kita mulakan dengan menyediakan jadual asas untuk tujuan demonstrasi.





CIPTA produk JADUAL (
product_id INT PRIMARY KUNCI AUTO_INNCREMENT,
nama_produk VARCHAR(255),
kategori VARCHAR(255),
harga PERPULUHAN(10, 2),
kuantiti INT,
tarikh tamat tempoh DATE,
kod bar BIGINT
);

masukkan
ke dalam
produk (nama_produk,
kategori,
harga,
kuantiti,
tarikh luput,
kod bar)
nilai ('Topi Chef 25cm',
'kedai roti',
24.67,
57,
'2023-09-09',
2854509564204);

masukkan
ke dalam
produk (nama_produk,
kategori,
harga,
kuantiti,
tarikh luput,
kod bar)
nilai ('Telur Puyuh - Dalam Tin',
'pantry',
17.99,
67,
'2023-09-29',
1708039594250);

masukkan
ke dalam
produk (nama_produk,
kategori,
harga,
kuantiti,
tarikh luput,
kod bar)
nilai ('Kopi - Egg Nog Capuccino',
'kedai roti',
92.53,
10,
'2023-09-22',
8704051853058);

masukkan
ke dalam
produk (nama_produk,
kategori,
harga,
kuantiti,
tarikh luput,
kod bar)
nilai ('Pear - Prickly',
'kedai roti',
65.29,
48,
'2023-08-23',
5174927442238);

masukkan
ke dalam
produk (nama_produk,
kategori,
harga,
kuantiti,
tarikh luput,
kod bar)
nilai ('Pasta - Rambut Malaikat',
'pantry',
48.38,
59,
'2023-08-05',
8008123704782);

masukkan
ke dalam
produk (nama_produk,
kategori,
harga,
kuantiti,
tarikh luput,
kod bar)
nilai ('Wine - Prosecco Valdobiaddene',
'menghasilkan',
44.18,
3,
'2023-03-13',
6470981735653);

masukkan
ke dalam
produk (nama_produk,
kategori,
harga,
kuantiti,
tarikh luput,
kod bar)
nilai ('Pastri - French Mini Assorted',
'pantry',
36.73,
52,
'2023-05-29',
5963886298051);

masukkan
ke dalam
produk (nama_produk,
kategori,
harga,
kuantiti,
tarikh luput,
kod bar)
nilai ('Oren - Tin, Mandarin',
'menghasilkan',
65.0,
1,
'2023-04-20',
6131761721332);

masukkan
ke dalam
produk (nama_produk,
kategori,
harga,
kuantiti,
tarikh luput,
kod bar)
nilai ('Babi - Bahu',
'menghasilkan',
55.55,
73,
'2023-05-01',
9343592107125);

masukkan
ke dalam
produk (nama_produk,
kategori,
harga,
kuantiti,
tarikh luput,
kod bar)
nilai ('Dc Hikiage Hira Huba',
'menghasilkan',
56.29,
53,
'2023-04-14',
3354910667072);

Dengan penciptaan dan persediaan data selesai, mari kita teruskan untuk membincangkan beberapa contoh.

Contoh 1: Penggunaan Asas

Dalam kes ini, kami mempunyai akses kepada jadual 'produk' yang mengandungi maklumat produk. Katakan kita ingin mendapatkan kod bar sebelumnya daripada baris semasa.



Kita boleh menggunakan fungsi lag() seperti berikut:

pilih
Nama Produk,
harga,
lag(barcode) over (partition by category
perintah oleh
harga asc) sebagai item_sebelumnya
daripada
produk p;

Kod yang diberikan membahagikan data berdasarkan kategori. Ia kemudian mengambil kod bar sebelumnya dalam partition menggunakan fungsi lag().

Output yang terhasil adalah seperti berikut:

Contoh 2: Menetapkan Nilai Lalai

Jika tiada baris sebelumnya dalam lajur tertentu (di luar sempadan), fungsi menetapkan nilai kepada NULL seperti yang ditunjukkan dalam contoh sebelumnya.

Untuk menetapkan nilai lalai bagi sebarang akses di luar skop, kami boleh melakukan perkara berikut:

pilih
Nama Produk,
harga,
lag(kod bar, 1, 'N/A') over (partition by category
perintah oleh
harga asc) sebagai item_sebelumnya
daripada
produk p;

Kami menetapkan nilai lalai kepada 'N/A'. Ini harus menggantikan mana-mana nilai luar terikat seperti yang ditunjukkan dalam output:

Contoh 3: Nilai Offset Tersuai

Katakan anda ingin mengakses dua baris sebelumnya daripada baris semasa. Kita boleh melakukannya dengan menetapkan nilai offset kepada 2.

Contoh pertanyaan digambarkan dalam perkara berikut:

pilih
Nama Produk,
harga,
lag(kod bar, 2, 'N/A') over (partition by category
perintah oleh
harga asc) sebagai item_sebelumnya
daripada
produk p;

Pengeluaran:

Pertanyaan ini mengembalikan dua baris sebelumnya dalam setiap partition.

Kesimpulan

Dalam tutorial ini, kami belajar cara bekerja dengan fungsi lag() untuk mendapatkan item sebelumnya daripada baris semasa.