SQL查询行中最常见的值

时间:2018-03-30 05:34:18

标签: sql sql-server

我的数据库看起来与下面的类似。

ID   A1   A2   A3    A4
7   2.31 2.31 2.31  2.32
8   2.32 2.32 2.32  2.32
9   2.31 2.3  2.31  2.31
10  2.32 2.3  2.32  2.31

现在我正在寻找一个SQL查询,它提供如下输出(从ID中选择A1,A2,A3,A4中最常用的值,并将其显示在A列中)

ID  A
7   2.31
8   2.32
9   2.31
10  2.32

有人可以帮我这个..

3 个答案:

答案 0 :(得分:7)

您可以尝试以下查询:

id | blah | foo
1   | x | m
1   | x | n
1   | x | o

Demo here

答案 1 :(得分:0)

您可以使用PIVOT尝试,如下所示:

CREATE TABLE #TABLE1 (
    ID INT, 
    A1 DECIMAL(10,2), 
    A2 DECIMAL(10,2),
    A3 DECIMAL(10,2), 
    A4 DECIMAL(10,2)
)

INSERT INTO #TABLE1 VALUES (7,2.31,2.31,2.31,2.32);
INSERT INTO #TABLE1 VALUES (8,2.32,2.32,2.32,2.32);
INSERT INTO #TABLE1 VALUES (9,2.31,2.3,2.31,2.31);
INSERT INTO #TABLE1 VALUES (10,2.32,2.3,2.32,2.31);
GO

select * from #TABLE1


SELECT ID, A
FROM (
    SELECT 
        ID, A, count(A) as 'RepeatCount',
        rank() over (partition by ID order by ID, count(A) desc) as 'ranked'
    FROM (
        SELECT ID, A1, A2, A3, A4
        FROM #TABLE1
    ) pvt
    UNPIVOT (
        A FOR COL IN (A1, A2, A3, A4)
    )AS unpvt
    group by ID, A
)A
WHERE ranked = 1
ORDER BY ID

drop table #TABLE1

enter image description here

答案 2 :(得分:0)

由于每行只涉及4个值,因此只需要检查单个匹配对。因为如果有平局,你可以正确地返回两者中的任何一个。

利用这一点,除了if / else逻辑之外,你可以使用除了它之外的任何东西:

SELECT ID,
IIF (
  A1 = A2 OR A1 = A3 OR A1 = A4,
  A1,
  IIF (
    A2 = A3 OR A2 = A4,
    A2,
    A3)
) A FROM mytable

Proof

Giorgos Betsos发布的解决方案具有更清晰,更安全的逻辑 但很确定我的方法资源较少。