Persediaan Temu Duga Pengaturcaraan · Pelajaran

FIRST_VALUE, LAST_VALUE dan Tepi Bingkai

Dapatkan nilai sempadan dan fahami perangkap bingkai LAST_VALUE

Pelajaran 4 daripada 413 langkah

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_VALUE berfungsi dengan bingkai lalai; LAST_VALUE tidak.
  • Bingkai lalai berakhir pada baris semasa, jadi baiki LAST_VALUE dengan ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING, atau terbalikkan susunan isihan dan gunakan FIRST_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.

Percuma untuk bermula

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

  1. LAG dan LEAD untuk Baris Bersebelahan
  2. Perubahan Tempoh ke Tempoh
  3. NTILE untuk Pengelompokan Julat
  4. FIRST_VALUE, LAST_VALUE dan Tepi Bingkai
← Kembali ke Persediaan Temu Duga Pengaturcaraan