sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL 13:制限…タイ付き

    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;

    この機能は、同じ値のすべての行を表示するのに役立ちます。これにより、テーブル内の物理的な場所のみに基づいて、同等の価値のある行を区別できなくなります。

    ハッピーページ付け!


    1. AndroidでSQLiteデータベースを処理するメソッドをテストする方法は?

    2. MariaDBをMacにインストールする

    3. ORA-01460:実装されていない、または不当な変換が要求されました

    4. Oracle:SQLサーバー用のプロファイラーのようなクエリをトレースするツールはありますか?