Gab*_*scu 14 mysql greatest-n-per-group
如何从表中选择前n个最大值?
对于这样的表:
column1 column2
1 foo
2 foo
3 foo
4 foo
5 bar
6 bar
7 bar
8 bar
Run Code Online (Sandbox Code Playgroud)
对于n = 2,结果必须是:
3
4
7
8
Run Code Online (Sandbox Code Playgroud)
以下方法仅选择每个组的最大值.
SELECT max(column1) FROM table GROUP BY column2
Run Code Online (Sandbox Code Playgroud)
返回:
4
8
Run Code Online (Sandbox Code Playgroud)
对于n = 2,您可以
SELECT max(column1) m
FROM table t
GROUP BY column2
UNION
SELECT max(column1) m
FROM table t
WHERE column1 NOT IN (SELECT max(column1)
WHERE column2 = t.column2)
Run Code Online (Sandbox Code Playgroud)
对于任何n,您都可以使用此处介绍的方法模拟分区之上的排名。
编辑:其实这个文章会给你你需要什么。
基本上是这样的
SELECT t.*
FROM
(SELECT grouper,
(SELECT val
FROM table li
WHERE li.grouper = dlo.grouper
ORDER BY
li.grouper, li.val DESC
LIMIT 2,1) AS mid
FROM
(
SELECT DISTINCT grouper
FROM table
) dlo
) lo, table t
WHERE t.grouper = lo.grouper
AND t.val > lo.mid
Run Code Online (Sandbox Code Playgroud)
用grouper要分组val的列的名称和保存值的列的名称替换。
要弄清楚它的功能是如何进行的,请从最内部的查询中逐步进行并运行它们。
另外,有一点简化- mid如果某些类别没有足够的值,则子查询可以返回NULL,因此应该在比较中将此常量保留为COALESCE(在您的情况下为MIN, val的域,在本文中为MAX)。
EDIT2: 我忘了提到确定n(LIMIT n,1)的是LIMIT 2,1。
| 归档时间: |
|
| 查看次数: |
10741 次 |
| 最近记录: |