key value
=== =====
one test
one another
one value
two goes
two here
two also
three example
如何用SQL编写这样的查询?
#1 楼
最容易编写的查询是针对MySQL(没有严格的ANSI设置)的查询。它使用非标准构造:SELECT key, value
FROM tableX
GROUP BY key ;
在最新版本(5.7和8.0+)中,其中严格设置和
ONLY_FULL_GROUP_BY
是默认设置,可以使用ANY_VALUE()
函数,是5.7中添加的:他们喜欢这样。优点是您还可以在结果中选择其他列(除了key
和value
):对于任何其他DBMS,几乎可以在任何地方使用的通用方法。一个缺点是您无法使用这种方法选择其他列。另一个是MIN()
和MAX()
之类的聚合函数不适用于某些DBMS中的某些数据类型(例如位,文本,blob):也可以使用特殊的非标准
DISTINCT ON
运算符。可选的ORDER BY
用于从每个组中选择应选择的行:SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
评论
@WilliamKF如果通过“任意选择”的意思是“随机选择”,则只需用对函数进行随机化调用来替换ypercube查询中的ORDER BY。
–雷·里菲尔(Leigh Riffel)
2012年9月14日17:05
@LeighRiffel不必是随机的,任何选择,就像遇到的第一个一样简单就可以了。
– WilliamKF
2012年9月14日20:20在
#2 楼
对于MS-SQl服务器:;with FinalDataset as
(
select *,
row_number() over(partition by key order by value) as rownum
from YourOriginalTable
)
select
key,
value
from FinalDataset
where rownum = 1
同样,第二个结果集的rownum = 2
#3 楼
与接受的答案类似,但是可以使用array_agg()代替min()或max()其中:
SELECT key, (array_agg(value))[1] AS value
FROM tableX
GROUP BY key ;
(在PostgreSQL上检查)
#4 楼
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
评论
这只是重复现有答案之一,没有任何解释。
–必须
20/12/21在14:32
评论
哪个DBMS(Oracle,SQL-Server,DB2,MySQL,Postgres)?这是专有系统。