web-dev-qa-db-ja.com

項目の最後と最初の出現を別々の列に入れる方法は?

私は休閑表を持っています:

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で順序付けされた値の最後と最初のオカレンスを取得するクエリを作成するにはどうすればよいですか?

2
Daniel Santos

テスト:

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

次に、値を取得するために、それを元のテーブルに自己結合します。

5
Akina