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 排序的最后一次和第一次出现的值,像这样?
测试:
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)
然后我们将其自连接回原始表以获取值。
归档时间: |
|
查看次数: |
3735 次 |
最近记录: |