4

これらのテーブルを考えると:

TABLE Stores (
 store_id INT,
 store_name VARCHAR,
 etc
);

TABLE Employees (
 employee_id INT,
 store_id INT,
 employee_name VARCHAR,
 currently_employed BOOLEAN,
 etc
);

各店舗の最も長く雇用されている 15 人の従業員 (たとえば、最低の 15 人としましょうemployee_id)、または 15 人の従業員がいる場合は店舗のすべての従業員をリストしたいと考えていますcurrently_employed='t'。join句でやりたい。

これを1行のみORDER BY、通常は最小または最大(単一の最長雇用従業員)で行う人々の例をたくさん見つけましたが、基本的には、結合内で anと aを結合したいと考えていLIMITます。これらの例のいくつかは、次の場所にあります。

また、このストアごとの適切な例を見つけました (私はありません。約 5000 のストアがあります)。

また、 andTOPの代わりに使用できるが、PostgreSQL には使用できないことも確認しました。ORDER BYLIMIT

従業員テーブル内で個別に作業することが可能であれば、2 つのテーブル間の結合句がこれを行うための唯一の (または必ずしも最良の方法でさえある) とは思わないstore_idので、他のアプローチにもオープンです。後からいつでも参加できます。

私は SQL に非常に慣れていないので、動作中の原則を理解するのに役立つ理論的背景や追加の説明が欲しいです。

4

2 に答える 2

2

これを行う古典的な方法は、次のようなウィンドウ関数rankを使用することです。

SELECT employee_name, store_name
FROM   (SELECT employee_name, store_name, 
        RANK() OVER (PARTITION BY store_name ORDER BY employee_id ASC) AS rk
        FROM   employees e
        JOIN   stores s ON e.store_id = s.store_id) t
WHERE  rk <= 15
于 2015-06-10T22:34:36.617 に答える