我需要查询一个SQL数据库以查找一列的所有不同值,并且需要另一列的任意值。例如,考虑下表,其中包含两列,即键和值:得到这三行:

key     value
===     =====
one     test
one     another
one     value
two     goes
two     here
two     also
three   example


如何用SQL编写这样的查询?

评论

哪个DBMS(Oracle,SQL-Server,DB2,MySQL,Postgres)?

这是专有系统。

#1 楼

最容易编写的查询是针对MySQL(没有严格的ANSI设置)的查询。它使用非标准构造:

SELECT key, value
FROM tableX
GROUP BY key ;


在最新版本(5.7和8.0+)中,其中严格设置和ONLY_FULL_GROUP_BY是默认设置,可以使用ANY_VALUE()函数,是5.7中添加的:他们喜欢这样。优点是您还可以在结果中选择其他列(除了keyvalue):对于任何其他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