使用SQL查找具有最常用属性的行
我的数据库中有下表:使用SQL查找具有最常用属性的行,sql,Sql,我的数据库中有下表: user_id | p1 | p2 | p3 1 | x | y | z 2 | x | x | x 3 | y | y | z 我需要找到在同一行之间包含最常用值的行。 i、 例如,第一行没有公共值,第二行包含三个公共值,第三行包含两个公共值 那么,这种情况下的输出应该是 user_id | p1 | p2 | p3 2 | x | x | x 有什么想法吗? (如果解决方案不需要特定于供应商的功能,那就
user_id | p1 | p2 | p3
1 | x | y | z
2 | x | x | x
3 | y | y | z
我需要找到在同一行之间包含最常用值的行。
i、 例如,第一行没有公共值,第二行包含三个公共值,第三行包含两个公共值
那么,这种情况下的输出应该是
user_id | p1 | p2 | p3
2 | x | x | x
有什么想法吗?
(如果解决方案不需要特定于供应商的功能,那就太好了,但任何功能都会有所帮助)。对于非特定于供应商的解决方案,您可以这样做
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
然后限制
,顶部
,行数
或任何依赖于RDBMS的内容,只获取顶部行
但是,如果您有一个特定的RDBMS,那么对于更多的列,可能还有其他更易于维护的方法(例如SQL Server 2008)
另外,您希望如何处理领带?对于非供应商特定的解决方案,您可以这样做
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
然后限制
,顶部
,行数
或任何依赖于RDBMS的内容,只获取顶部行
但是,如果您有一个特定的RDBMS,那么对于更多的列,可能还有其他更易于维护的方法(例如SQL Server 2008)
另外,您希望如何处理领带?第二种解决方案非常聪明。第二种解决方案非常聪明。