我的数据库中有以下表格:
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
有什么想法吗? (如果解决方案不需要特定于供应商的功能,那将会很好,但任何事情都会有所帮助。)
答案 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
然后LIMIT
,TOP
,ROW_NUMBER
或依赖于RDBMS的任何内容才能获得最高行。
但是如果你有一个特定的RDBMS,可能有其他方法可以更容易维护大量的列(例如对于SQL Server 2008)
SELECT TOP 1 *
FROM YourTable
ORDER BY
(SELECT COUNT (DISTINCT p) FROM (VALUES(p1),(p2),(p3)) T(p))
你还想怎么处理领带?