选择优先级较高的行并返回其值,按类型分组

问题描述

我需要基于SELECT并同时使用ORDER BY的列GROUP BY

例如,我有以下数据:

id | type | value | priority
-    A      1       100
-    A      2       0
-    B      3       0
-    B      4       100

我需要GROUP BY typeSELECT value考虑ORDER BY priority DESC在这种情况下,输出将是:

type | value
A    | 1
B    | 4

当前,我可以选择MIN()报告的MAX()value值,例如:

SELECT MAX(value) ... GROUP BY type

但是它将返回错误

type | value
A    | 2
B    | 4

我需要的是类似的东西

SELECT (value ORDER BY priority DESC) ... GROUP BY type

解决方法

我发现使用GROUP_CONCAT()支持您自己的范围ORDER BYLIMIT的很好的解决方案。

SELECT GROUP_CONCAT(value ORDER BY priority DESC LIMIT 1)
,

如果您的数据库版本为10.2+,请考虑使用诸如ROW_NUMBER()之类的解析函数,其中PARTITION BY type用于GROUP BY类型列,并从该函数中滤除等于1的返回值。 :

WITH t2 AS
(
 SELECT *,ROW_NUMBER() OVER (PARTITION BY type ORDER BY priority DESC) AS rn
   FROM t --> your original table
)   
SELECT type,value
  FROM t2
 WHERE rn = 1 

Demo