如何将最后一次和第一次出现的项目放入单独的列中?

Dan*_*tos 2 mysql query greatest-n-per-group

我确实有一张休闲表:

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
Run Code Online (Sandbox Code Playgroud)

我想在如下表中获取第一个和最后一个值(按 排序id):

name    value_1st  value_last
Daniel  3         2
Carol   9         9  
Ray     5         NULL
Charles 1         NULL
Run Code Online (Sandbox Code Playgroud)

如何编写查询以获取按名称分组并按 id 排序的最后一次和第一次出现的值,像这样?

Aki*_*ina 6

测试:

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;
Run Code Online (Sandbox Code Playgroud)

对于复杂的查询,您应该始终由内而外地工作,

SELECT name, min(id) AS min_id, max(id) AS max_id
FROM table 
GROUP BY name;
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到我们正在抓取每个用户的 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)
Run Code Online (Sandbox Code Playgroud)

在我们这样做之后,我们有一张桌子,

         min(id) | max(id)
Daniel | 1       | 3
Carol  | 4       | 6
Ray    | 7       | 7
Charles| 8       | 8
Run Code Online (Sandbox Code Playgroud)

然后我们将其自连接回原始表以获取值。