我有一个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
关于列Id
,ValueA
和ValueB
,没有任何问题。另一方面,对MAX
和NameA
使用NameB
的内容并不如预期。经过一些谷歌搜索和搜索后,我意识到MAX
没有字母数字列的“预期”行为。说出预期,我的意思是在我的情况下使用MAX
,它将返回NameA
的值,其最大字符数为MAX(LEN(NameA))
。我在这里要提到的是,NameA
不可能为同一Id
长度相同的TSQL
设置两个值。这可能会使问题更容易解决。
我使用SQL Server 2012和.then()
。
您对如何处理此问题有任何建议吗?
非常感谢您提前寻求帮助。
答案 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
答案 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;