私は従業員テーブルで2番目に高い給与について質問していません。従業員テーブルの複数のエントリを含む従業員テーブルの各従業員の2番目に高い給料を得る方法
click here to see employee table
私は従業員テーブルで2番目に高い給与について質問していません。従業員テーブルの複数のエントリを含む従業員テーブルの各従業員の2番目に高い給料を得る方法
click here to see employee table
内側のクエリは彼らの最高の給料を従業員に返却してから出てから、それらを照会しますhelps-ホープ最高給与は になるので、二番目に高い給与を得ます。
SELECT MAX(T.salery),T.NAME FROM TABLE T
INNER JOIN (SELECT MAX(salery),NAME FROM TABLE GROUP BY NAME) TT
ON TT.NAME=T.NAME AND TT.SALERY!= T.SALERY
GROUP BY T.NAME;
例
mysql> SELECT * FROM payments;
+----+------------+---------+-------+
| id | date | user_id | value |
+----+------------+---------+-------+
| 1 | 2016-06-22 | 1 | 10 |
| 2 | 2016-06-22 | 3 | 15 |
| 3 | 2016-06-22 | 4 | 20 |
| 4 | 2016-06-23 | 2 | 100 |
| 5 | 2016-06-23 | 1 | 150 |
| 6 | 2016-06-23 | 2 | 340 |
+----+------------+---------+-------+
6 rows in set (0.00 sec)
mysql> select max(value),user_id from payments group by user_id;
+------------+---------+
| max(value) | user_id |
+------------+---------+
| 150 | 1 |
| 340 | 2 |
| 15 | 3 |
| 20 | 4 |
+------------+---------+
4 rows in set (0.00 sec)
mysql> select max(T.value),TT.user_id from payments T inner join (select max(value) as val,user_id from payments group by user_id) TT on T.value!=TT.val and T.user_id=TT.user_id group by T.user_id;;
+--------------+---------+
| max(T.value) | user_id |
+--------------+---------+
| 10 | 1 |
| 100 | 2 |
+--------------+---------+
2 rows in set (0.00 sec)
私は非常に迅速な解決策は、このようなことができると思い:
SELECT MAX(column) FROM table WHERE column < (SELECT MAX(column) FROM table)
はそれが
OPは "各従業員"と言っていますが、これは1つの行だけを返します。私はまだ彼のデータベース設計が意味をなさないと思う。 –
@Matti Virkkunenあなたは正しいです、実際にはテーブルは正規化されるべきですが、ここではそうではありません... –
これは彼が各従業員のためにそれを手に入れたい –
なぜ複数の行に一人で?履歴データを保持することが分かっていれば分かりますが、それらのタイムスタンプはすべて同じです。 –