FIRST_VALUE, LAST_VALUE dan Tepi Bingkai
Dapatkan nilai sempadan dan fahami perangkap bingkai LAST_VALUE
FIRST_VALUE, LAST_VALUE dan Tepi Bingkai ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.
Mendapatkan Nilai Sempadan
Penemuduga bertanya: "Tunjukkan setiap baris bersama-sama nilai pertama dan terakhir dalam kumpulannya." Fikirkan tarikh log masuk pertama bagi setiap pengguna atau harga terkini dalam satu kumpulan di samping setiap baris terperinci.
Fungsinya ialah FIRST_VALUE dan LAST_VALUE. Kedua-duanya kelihatan mudah, tetapi LAST_VALUE menyembunyikan salah satu perangkap bingkai tetingkap yang paling terkenal dalam bahasa pertanyaan berstruktur. Pelajaran ini menjadikan kedua-duanya boleh dipercayai.
Asas FIRST_VALUE
FIRST_VALUE(col) mengembalikan nilai col daripada baris pertama tetingkap dan melampirkannya pada setiap baris. Jika disusun mengikut tarikh, fungsi ini memberikan nilai terawal dalam kumpulannya kepada setiap baris.
Oleh sebab bingkai lalai bermula pada baris pertama kumpulan, FIRST_VALUE biasanya berfungsi tepat seperti yang dijangkakan.
SELECT
user_id,
login_date,
FIRST_VALUE(login_date) OVER (
PARTITION BY user_id
ORDER BY login_date
) AS first_login
FROM logins;Bingkai Tetingkap Lalai
Inilah perkara utama. Apabila anda menambahkan ORDER BY pada tetingkap, bingkai lalai ialah RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
Ini bermakna tetingkap bagi setiap baris hanya merangkumi dari awal partisi hingga baris semasa, bukannya hingga penghujung. FIRST_VALUE tidak terjejas (baris pertama sentiasa berada dalam julat), tetapi LAST_VALUE terjejas teruk.
Perangkap LAST_VALUE
Jalankan LAST_VALUE hanya dengan ORDER BY, dan kebanyakan calon menjangkakan nilai terakhir partisi. Sebaliknya, kerana bingkai berakhir pada baris semasa, "nilai terakhir dalam bingkai" hanyalah nilai baris semasa itu sendiri.
Jadi kueri ini mengembalikan login_date itu sendiri pada setiap baris, yang kelihatan rosak. Inilah perangkap fungsi tetingkap yang paling kerap ditanya.
SELECT
user_id,
login_date,
LAST_VALUE(login_date) OVER (
PARTITION BY user_id
ORDER BY login_date
) AS wrong_last_login
FROM logins;Membaiki LAST_VALUE dengan Bingkai Penuh
Pembetulannya ialah meluaskan bingkai supaya merangkumi seluruh partisi: ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.
Kini tetingkap bagi setiap baris merangkumi seluruh partisi, maka LAST_VALUE mengembalikan nilai terakhir sebenar. Nyatakan pembetulan ini dengan jelas dalam temu duga; ini membuktikan bahawa anda memahami bingkai, bukan sekadar nama fungsi.
SELECT
user_id,
login_date,
LAST_VALUE(login_date) OVER (
PARTITION BY user_id
ORDER BY login_date
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
) AS last_login
FROM logins;Alternatif yang Lebih Mudah
Ramai jurutera mengelakkan bingkai sepenuhnya: untuk mendapatkan nilai terakhir, gunakan FIRST_VALUE dengan susunan isihan yang diterbalikkan.
FIRST_VALUE(login_date) OVER (... ORDER BY login_date DESC) mengembalikan tarikh terbaharu tanpa memerlukan klausa bingkai. Ini ialah helah yang kemas dan mudah diingati untuk disebut.
SELECT
user_id,
login_date,
FIRST_VALUE(login_date) OVER (
PARTITION BY user_id
ORDER BY login_date DESC
) AS last_login
FROM logins;ROWS Berbanding RANGE dalam Bingkai
Bingkai mempunyai dua bentuk. ROWS mengira baris fizikal; RANGE mengumpulkan nilai ORDER BY yang sama (rakan setara).
Bingkai lalai menggunakan RANGE, sebab itu nilai ORDER BY yang seri berkongsi sempadan bingkai. Untuk membaiki LAST_VALUE, utamakan ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING yang dinyatakan secara jelas untuk mengelakkan kejutan apabila terdapat nilai seri.
NTH_VALUE untuk Kedudukan Sewenang-wenangnya
Selain nilai pertama dan terakhir, NTH_VALUE(col, n) mendapatkan nilai pada kedudukan n dalam bingkai, contohnya harga kedua tertinggi.
Ia mematuhi peraturan bingkai yang sama seperti LAST_VALUE, jadi gabungkan dengan bingkai penuh apabila anda mahu nilai ke-n merentas seluruh partisi, bukannya hanya sehingga baris semasa.
SELECT
product_id,
price,
NTH_VALUE(price, 2) OVER (
PARTITION BY product_id
ORDER BY price DESC
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
) AS second_highest_price
FROM prices;Contoh Lengkap: Pertama dan Terakhir Bersama
Laporan biasa memaparkan setiap transaksi di sebelah amaun transaksi pertama dan terakhir pelanggan. Gabungkan kedua-dua fungsi itu, sambil mengingati bingkai eksplisit untuk LAST_VALUE.
Kini setiap baris membawa nilai pertama dan terakhir seluruh partisi, sedia untuk pengiraan perbezaan atau langkah pelabelan.
SELECT
customer_id,
txn_date,
amount,
FIRST_VALUE(amount) OVER w AS first_amt,
LAST_VALUE(amount) OVER w AS last_amt
FROM transactions
WINDOW w AS (
PARTITION BY customer_id
ORDER BY txn_date
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
);Tetingkap Dinamakan Mengekalkan DRY
Perhatikan bahawa kueri sebelumnya menggunakan klausa WINDOW w AS (...) dan merujuk OVER w dua kali. Menentukan tetingkap sekali mengelakkan pengulangan spesifikasi bingkai yang panjang dan menghalang kedua-dua fungsi daripada menyimpang.
Kebanyakan pangkalan data utama menyokong tetingkap dinamakan. Menggunakannya ialah sentuhan kemas yang dihargai oleh penemuduga apabila beberapa lajur berkongsi satu tetingkap.
Contoh Lengkap: Perubahan dari Pertama ke Terakhir
Soalan susulan yang kerap ditanya ialah perubahan daripada transaksi pertama kepada transaksi terakhir pelanggan. Dengan kedua-dua nilai sempadan pada setiap baris, tolak kedua-duanya, kemudian buang pendua supaya tinggal satu baris bagi setiap pelanggan jika perlu.
Ini menggabungkan pembetulan bingkai penuh dengan pengiraan aritmetik mudah, iaitu jenis jawapan dari awal hingga akhir yang mahu dilihat oleh penemuduga disusun dengan kemas.
SELECT DISTINCT
customer_id,
LAST_VALUE(amount) OVER w - FIRST_VALUE(amount) OVER w AS first_to_last_delta
FROM transactions
WINDOW w AS (
PARTITION BY customer_id
ORDER BY txn_date
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
);Semakan Pantas
Perangkap klasik LAST_VALUE.
Ringkasan
Fungsi nilai sempadan bergantung pada bingkai:
FIRST_VALUEberfungsi dengan bingkai lalai;LAST_VALUEtidak.- Bingkai lalai berakhir pada baris semasa, jadi baiki
LAST_VALUEdenganROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING, atau terbalikkan susunan isihan dan gunakanFIRST_VALUE. NTH_VALUE(col, n)mendapatkan kedudukan sewenang-wenangnya; tetingkap dinamakan mengekalkan spesifikasi berbilang lajur supaya DRY.
Itu melengkapkan kit alat LAG, LEAD, NTILE dan nilai sempadan.
Pelajari Persediaan Temu Duga Pengaturcaraan dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 90
- Pelajaran
- 360
Soalan Lazim
Adakah pelajaran “FIRST_VALUE, LAST_VALUE dan Tepi Bingkai” percuma?
Ya — teks penuh “FIRST_VALUE, LAST_VALUE dan Tepi Bingkai” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “FIRST_VALUE, LAST_VALUE dan Tepi Bingkai”?
Dapatkan nilai sempadan dan fahami perangkap bingkai LAST_VALUE Anda berlatih Persediaan Temu Duga Pengaturcaraan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga Pengaturcaraan?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “FIRST_VALUE, LAST_VALUE dan Tepi Bingkai” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga Pengaturcaraan ini?
Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- LAG dan LEAD untuk Baris Bersebelahan
- Perubahan Tempoh ke Tempoh
- NTILE untuk Pengelompokan Julat
- FIRST_VALUE, LAST_VALUE dan Tepi Bingkai