我是一个有用的助手,可以帮助您进行文本翻译。
我很菜,因此让我尝试阐明我的问题。我有一个类似于以下表格的表格:
Source Value User
======== ======= ======
old1 1 Phil
new 2 Phil
old2 3 Phil
new 4 Phil
old1 1 Mike
old2 2 Mike
new 1 Jeff
new 2 Jeff
我需要做的是创建一个查询,根据来源和值为用户获取值。它应该遵循以下规则:
对于每个用户,获取最高值。但是,如果该用户存在“old1”或“old2”,则忽略“new”源。
因此,根据这些规则,我的查询应该从这个表中返回以下结果:
Value User
======= ======
3 Phil
2 Mike
2 Jeff
我想出了一个查询,几乎符合所需要求:
SELECT MAX([Value]), [User]
FROM
(
SELECT CASE [Source]
WHEN 'old1' THEN 1
WHEN 'old2' THEN 1
WHEN 'new' THEN 2
END AS [SourcePriority],
[Value],
[User]
FROM #UserValues
) MainPriority
WHERE [SourcePriority] = 1
GROUP BY [User]
UNION
SELECT MAX([Value]), [User]
FROM
(
SELECT CASE [Source]
WHEN 'old1' THEN 1
WHEN 'old2' THEN 1
WHEN 'new' THEN 2
END AS [SourcePriority],
[Value],
[User]
FROM #UserValues
) SecondaryPriority
WHERE [SourcePriority] = 2
GROUP BY [User]
然而,这将返回以下结果:
Value User
======= ======
3 Phil
4 Phil
2 Mike
2 Jeff
显然,Phil = 4 的额外值是不需要的。我该如何尝试修复这个查询?我也知道这是一个相当复杂的解决方案,可能可以通过正确使用聚合更轻松地解决,但我还不太熟悉聚合,所以才会采用联合的方式。本质上,我正在寻求创建最清晰的解决方案的帮助。
如果有人想自己填充表格,请看以下 SQL 代码:
CREATE TABLE #UserValues
(
[Source] VARCHAR(10),
[Value] INT,
[User] VARCHAR(10)
)
INSERT INTO #UserValues VALUES
('old1', 1, 'Phil'),
('new', 2, 'Phil'),
('old2', 3, 'Phil'),
('new', 4, 'Phil'),
('old1', 1, 'Mike'),
('old2', 2, 'Mike'),
('new', 1, 'Jeff'),
('new', 2, 'Jeff')