私は休閑表を持っています:
id name value
1 Daniel 3
2 Daniel 7
3 Daniel 2
4 Carol 9
5 Carol 4
6 Carol 9
7 Ray 5
8 Charles 1
次のようなテーブルの最初と最後の値(id
で並べ替え)を取得したいと思います。
name value_1st value_last
Daniel 3 2
Carol 9 9
Ray 5 NULL
Charles 1 NULL
このように、名前でグループ化され、IDで順序付けされた値の最後と最初のオカレンスを取得するクエリを作成するにはどうすればよいですか?
テスト:
SELECT
t_min_max.name,
t_min.value AS value_1st,
CASE WHEN min_id <> max_id THEN t_min.value END AS value_last
FROM (
SELECT name, min(id) AS min_id, max(id) AS max_id
FROM table
GROUP BY name
) AS t_min_max
JOIN table AS t_min
ON t_min_max.min_id = t_min.id
JOIN table AS t_max
ON t_min_max.max_id = t_max.id;
複雑なクエリでは、常に内側から外側に向かって作業する必要があります。
SELECT name, min(id) AS min_id, max(id) AS max_id
FROM table
GROUP BY name;
各ユーザーのIDの範囲を取得していることがわかります。
id name value
1 Daniel 3 <- this is a min(id)
2 Daniel 7
3 Daniel 2 <- this is a max(id)
4 Carol 9 <- this is a min(id)
5 Carol 4
6 Carol 9 <- this is a max(id)
7 Ray 5 <- this is both min(id) and max(id)
8 Charles 1 <- this is both min(id) and max(id)
これを実行すると、次のようなテーブルができます。
min(id) | max(id)
Daniel | 1 | 3
Carol | 4 | 6
Ray | 7 | 7
Charles| 8 | 8
次に、値を取得するために、それを元のテーブルに自己結合します。