0

簡単にするために、「employee」というテーブルがあるとします。

id INT NOT NULL PRIMARY KEY,
salary FLOAT,
department VARCHAR(255)

各部門の最低給与を取得する場所を実行してクエリを実行したいと考えています。だから私のクエリは次のようなものです:

SELECT employee.ID, MIN(employee.salary), employee.department
FROM employee
GROUP BY employee.department

ただし、どのレコードが見つかったかに関係なく。結果セットの ID 値は 1,2,3... に名前が変更されます。結果セットに存在するレコード (部門) の数に制限はありません。

AGGREGATE 関数を実行した後、従業員の実際の ID を維持するにはどうすればよいGROUP BYですか?

4

5 に答える 5

4

できません。考えてみてください。ある部門に20人の従業員がいて、その部門に同じ最低賃金の3人の従業員がいる場合、クエリ出力に表示するEmployeeIdはどれですか。各部門に最低給与の従業員が1人しかいないことが保証されている場合は、給与が各部門の最小値である特定の従業員レコードを選択することで実行できます。

Select EmployeeID
From Employee e
Where Salary = 
      (Select Min(Salary) From EMployee
       Where DepartmentId = e.DepartmentId)

ただし、複数の従業員がその最低給与レベルを持っている場合、これは部門ごとに複数のレコードを返します。

于 2010-01-20T00:21:27.147 に答える
2

クエリがあいまいで、標準のSQLまたはほとんどのブランドのRDBMSで許可されていないため、MySQLまたはSQLiteを使用していると思います。MySQLとSQLiteはより寛容であるため、あいまいさを解決するのはあなたの責任です。

これが私のいつもの修正です:

SELECT e1.ID, e1.salary, e1.department
FROM employee e1
LEFT OUTER JOIN employee e2 ON (e1.department = e2.department
    AND e1.salary > e2.salary)
WHERE e2.department IS NULL;

同じ結果をもたらす別の解決策は次のとおりです。

SELECT e1.ID, e1.salary, e1.department
FROM employee e1
JOIN (SELECT e2.department, MIN(e2.salary) AS min_salary
      FROM employee e2 GROUP BY e2.department) d
  ON (e1.salary = d.min_salary);

部門内に同じ最低給与の従業員が複数いる場合、これらは両方とも部門ごとに複数の行を提供します。問題の説明からは明らかではないため、そのケースを解決する方法を決定する必要があります。

于 2010-01-20T01:38:10.573 に答える
1

これでうまくいきます:

SELECT employee.department, MIN(employee.salary), employee.ID
FROM employee
GROUP BY 1
于 2010-01-20T00:17:24.710 に答える
1

スクリプトが無効です:

SELECT employee.ID, MIN(employee.salary), employee.department
FROM employee
GROUP BY employee.department

代わりに、これを見てください:

SELECT MIN(employee.salary), employee.department
FROM employee
GROUP BY employee.department

従業員IDも必要な場合は、サブクエリを使用する必要があります。

于 2010-01-20T00:18:53.673 に答える
0

最新の SQL Server リリース (およびその他の適度に強力な最新の SQL エンジン) では、SQL の "ウィンドウ関数" がおそらく、(サブクエリや自己結合よりも優先される) 最良の代替手段であり、目的を実行することができます。

  SELECT ID, salary, department
  FROM employee
  WHERE 1 = ROW_NUMBER() OVER(PARTITION BY department ORDER BY salary ASC)

これは、複数の従業員が同じ (部門の最低) 給与を持っている場合に、そのうちの "ランダムな" 1 つだけが必要な場合に機能します (ORDER BY特定の基準で選択したい場合は、基準を追加できます)。すべてが必要な場合RANKは、の代わりに、を調べてください。ROW_NUMBER

于 2010-01-20T00:25:39.323 に答える