假设我们在 SQLite 中有下表和查询:
\n| ID | 瓦尔 | 家长 | 信 | 
|---|---|---|---|
| 1 | 3 | 10 | A | 
| 2 | 3 | 10 | 乙 | 
| 3 | 0 | 10 | C | 
| 4 | 5 | 20 | d | 
SELECT id, MAX(val), parent, letter FROM table GROUP BY parent\n的价值有任何保证吗id?在 MySQL 中甚至有一种模式禁止选择非聚合值。如果没有这样的保证,是否有可能以某种方式获得每行parent?
| ID | 最大值(值) | 家长 | 信 | 
|---|---|---|---|
| 1\xe2\x80\xa0 | 3 | 10 | A | 
| 4 | 5 | 20 | d | 
letter\xe2\x80\xa0 或 2(只要来自同一行就没关系)
此行为在 S ELECT/简单选择处理/旁注:聚合查询中的裸列中进行了介绍。
在查询中,未聚合且未包含在子句中的列id和称为裸列。
因为您使用聚合函数,所以这两列的值:letterGROUP BYMAX()
...从还包含最小值或最大值的输入行中获取值
但是,由于可能存在超过 1 行且其最大值val相同parent:
如果两个或多个输入行具有相同的最小值或最大值,则仍然存在歧义
这意味着对于您的示例数据,不能保证您将获得结果中的parent = 10行。您可能会得到也包含最大值的
行。id = 1id = 2val
假设在这种情况下,对于同一个父级,可能存在超过 1 行具有最大值的行val,而您想要具有最小值的行,则可以使用窗口函数id来实现:
SELECT id, val, parent, letter
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY parent ORDER BY val DESC, id) rn
  FROM tablename
)
WHERE rn = 1
或者:
SELECT DISTINCT
       FIRST_VALUE(id) OVER (PARTITION BY parent ORDER BY val DESC, id) id, 
       MAX(val) OVER (PARTITION BY parent) val, 
       parent, 
       FIRST_VALUE(letter) OVER (PARTITION BY parent ORDER BY val DESC, id) letter
FROM tablename 
请参阅演示。
| 归档时间: | 
 | 
| 查看次数: | 599 次 | 
| 最近记录: |