Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL查找具有最常用属性的行_Sql - Fatal编程技术网

使用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)


另外,您希望如何处理领带?

第二种解决方案非常聪明。第二种解决方案非常聪明。