使用SQL查找具有最常见属性的行

时间:2011-07-30 00:16:51

标签: sql

我的数据库中有以下表格:

user_id | p1 | p2 | p3
1       | x  | y  | z
2       | x  | x  | x
3       | y  | y  | z

我需要找到包含同一行之间最常见值的行。 即,第一行没有公共值,第二行包含三个公共值,第三行包含两个公共值。

然后,这种情况下的输出应为

user_id | p1 | p2 | p3
2       | x  | x  | x

有什么想法吗? (如果解决方案不需要特定于供应商的功能,那将会很好,但任何事情都会有所帮助。)

1 个答案:

答案 0 :(得分:1)

对于非供应商特定的解决方案,您可以

SELECT *
FROM YourTable
ORDER BY 
CASE WHEN p1=p2 THEN 1 ELSE 0 END +
CASE WHEN p1=p3 THEN 1 ELSE 0 END +
CASE WHEN p2=p3 THEN 1 ELSE 0 END DESC

然后LIMITTOPROW_NUMBER或依赖于RDBMS的任何内容才能获得最高行。

但是如果你有一个特定的RDBMS,可能有其他方法可以更容易维护大量的列(例如对于SQL Server 2008)

SELECT TOP 1 *
FROM YourTable
ORDER BY 
(SELECT COUNT (DISTINCT p) FROM (VALUES(p1),(p2),(p3)) T(p))

你还想怎么处理领带?