tsql group by获取具有最大长度的字母数字列值

Chr*_*tos 5 sql sql-server group-by max sql-server-2012

我有一个sql视图,让我们调用它SampleView,其结果具有以下格式.

Id (INT), NameA (VARVHAR(50)), NameB (VARCHAR(50)), ValueA (INT), ValueB (INT)
Run Code Online (Sandbox Code Playgroud)

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

SELECT 
    Id,
    MAX(NameA),
    MAX(NameB),
    MAX(ValueA),
    MAX(ValueB)
FROM SampleView
GROUP BY Id
ORDER BY Id
Run Code Online (Sandbox Code Playgroud)

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

我使用SQL Server 2012和TSQL.

您对我如何处理这个问题有任何建议吗?

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

Gio*_*sos 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
Run Code Online (Sandbox Code Playgroud)

演示在这里