PostgreSQL 13の新機能の1つは、SQL標準のWITH TIESです。 LIMITで使用する句 —または、標準で呼ばれているように、FETCH FIRST n ROWS 。最初のパッチ作成者としてSurafelTemesgenに感謝します。 Tomas Vondraとあなたは、いくつかの追加のコード修正を本当に求めています。とレビュアーのAndrewGierthとErikRijkers。コミットメッセージを熟読することができます。
物事をランク付けするとき、同点は非常に頻繁です。たとえば、党員集会のレースでは、多くの関係があり、参加者から賞品を奪いたくないことは確かです。 WITH TIES 非常に簡単です。LIMITごとに返された最後の行と同じランクの場合、次の1つまたは複数の行を結果セットに追加します。 ORDER BYによると句 条項。
給与が最も高い2人の従業員だけが必要な場合は、次のようにします。
SELECT * FROM employees ORDER BY salary DESC LIMIT 2;
| name | 給与 | 部門 |
|---|---|---|
| アリシア | 1600 | エンジニアリング |
| オルガ | 1500 | マーケティング |
それで、あなたは次の人の給料を知りたがっていますか?彼女がオルガと一致し、純粋な偶然または不運によって取り残された場合はどうなりますか?ご存知のように、それは起こり得ます。そして幸いなことに、WITH TIES その日を救うために今そこにいます。 (実際には、WITH TIESは処理しません。 LIMITで そのような条項。 FETCH FIRSTを使用する必要があります WITH TIESを使用できるようにするための、標準で義務付けられている構文。 。)
SELECT * FROM employees ORDER BY salary DESC FETCH FIRST 2 ROWS WITH TIES;
| name | 給与 | 部門 |
|---|---|---|
| アリシア | 1600 | エンジニアリング |
| オルガ | 1500 | 販売 |
| コネホブランコ | 1500 | マーケティング |
三!白うさぎ持っていた リストされるために、そして今彼はそうです。
あなたが怒りすぎる前にいくつかのメモ。 LIMIT (より正確にはFETCH FIRST )指定した行数を正確に返すことを約束しなくなりました。 2つまたは20の追加行、または要求した数の100倍の行を取得できます。特に、結果をページ分割する場合は、これまでに表示した行数を追跡する必要があることを意味します。上記では3行あるので、次のページでは、適切なOFFSETを追加して、その数をスキップします。 条項:
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES
OFFSET 3; | name | 給与 | 部門 |
|---|---|---|
| Falsa Tortuga | 1400 | マーケティング |
| デュケサ | 1300 | 販売 |
| Liebre de Marzo | 1300 | エンジニアリング |
要求した2つではなく、3つを取得しました。したがって、次のページでは6つスキップする必要があります。等々。みんなのために十分な指ぬきを持っていることを確認してください。
もう1つ覚えておくべきことは、必ずORDER BYのみを使用する必要があるということです。 WITH TIESに適した句 句;たとえば、同じ給与の行を名前順に並べ替えたい場合は、サブクエリを使用する必要があります。そうしないと、名前の区別によって給与の同点が解決されるため、次の行は含まれません。例:
SELECT * FROM (
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES) AS subq
ORDER BY salary DESC, name;
この機能は、同じ値のすべての行を表示するのに役立ちます。これにより、テーブル内の物理的な場所のみに基づいて、同等の価値のある行を区別できなくなります。
ハッピーページ付け!