tsql group by get alphanumeric column value,其最大长度为

时间:2016-03-16 10:57:33

标签: sql sql-server sql-server-2012 group-by max

我有一个sql视图,我们称之为SampleView,其结果具有以下格式。

Id (INT), NameA (VARVHAR(50)), NameB (VARCHAR(50)), ValueA (INT), ValueB (INT)

视图的结果集包含可能具有相同Id的行。如果有两个或多个具有相同Id的行,我希望得到类似以下内容的

SELECT 
    Id,
    MAX(NameA),
    MAX(NameB),
    MAX(ValueA),
    MAX(ValueB)
FROM SampleView
GROUP BY Id
ORDER BY Id

关于列IdValueAValueB,没有任何问题。另一方面,对MAXNameA使用NameB的内容并不如预期。经过一些谷歌搜索和搜索后,我意识到MAX没有字母数字列的“预期”行为。说出预期,我的意思是在我的情况下使用MAX,它将返回NameA的值,其最大字符数为MAX(LEN(NameA))。我在这里要提到的是,NameA不可能为同一Id长度相同的TSQL设置两个值。这可能会使问题更容易解决。

我使用SQL Server 2012和.then()

您对如何处理此问题有任何建议吗?

非常感谢您提前寻求帮助。

3 个答案:

答案 0 :(得分:2)

您可以使用以下相关查询:

SELECT 
    t.Id,
    (SELECT TOP 1 s.NameA FROM SampleView s
     WHERE s.id = t.id
     ORDER BY length(s.NameA) DESC) as NameA,
    (SELECT TOP 1 s.NameB FROM SampleView s
     WHERE s.id = t.id
     ORDER BY length(s.NameB) DESC) as NameB,
    MAX(t.ValueA),
    MAX(t.ValueB)
FROM SampleView t
GROUP BY t.Id
ORDER BY t.Id

答案 1 :(得分:2)

您可以使用窗口功能:

SELECT DISTINCT 
       id,
       FIRST_VALUE(NameA) OVER (PARTITION BY id 
                                ORDER BY len(NameA) DESC) AS MaxNameA,
       MAX(ValueA) OVER (PARTITION BY id) AS MaxValueA,
       FIRST_VALUE(NameB) OVER (PARTITION BY id 
                                ORDER BY len(NameB) DESC) AS MaxNameB,
       MAX(ValueB) OVER (PARTITION BY id) AS MaxValueB      
FROM SampleView

Demo here

答案 2 :(得分:0)

一种可能的变体是使用ROW_NUMBER两次:

WITH
CTE_NameA
AS
(
    SELECT
        Id,
        NameA,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY LEN(NameA) DESC) AS rnA
    FROM SampleView
)
,CTE_NameB
AS
(
    SELECT
        Id,
        NameB,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY LEN(NameB) DESC) AS rnB
    FROM SampleView
)
SELECT 
    Id,
    CTE_NameA.NameA,
    CTE_NameB.NameB,
    MAX(ValueA),
    MAX(ValueB)
FROM
    SampleView
    INNER JOIN CTE_NameA ON CTE_NameA.Id = SampleView.Id AND CTE_NameA.rnA = 1
    INNER JOIN CTE_NameB ON CTE_NameB.Id = SampleView.Id AND CTE_NameB.rnB = 1
GROUP BY Id
ORDER BY Id;
相关问题