我正在尝试创建SQL查询时遇到一些麻烦。表格格式如下,
ID | Data Identifier | Date Added | Data Column
1 | 1001 | 15400 | Newest Value
1 | 1001 | 15000 | Oldest Value
1 | 1001 | 15200 | Older Value
1 | 1002 | 16000 | Newest Value
2 | 1001 | 16000 | Newest Value
我要做的是,对于列表中的每个ID(1,2),对于(1001,1002)中的每个数据标识符,只返回具有第一个匹配字段id和最近和最低日期的行16001
结果将是:
1 | 1001 | 15400 | Newest Value
1 | 1002 | 16000 | Newest Value
2 | 1001 | 16000 | Newest Value
我尝试了几种连接方式,但我一直在返回重复记录。任何建议或帮助将不胜感激。
答案 0 :(得分:2)
好像你想要GROUP BY,也许是自我加入到桌面上。
我有以下代码:
-- Preparing a test table
INSERT INTO #tmpTable(ID, Identifier, DateAdded, DataColumn)
SELECT 1, 1001, 15400, 'Newest Value'
UNION
SELECT 1, 1001, 15000, 'Oldest Value'
UNION
SELECT 1, 1001, 15200, 'Older Value'
UNION
SELECT 1, 1002, 16000, 'Newest Value'
UNION
SELECT 2, 1001, 16000, 'Newest Value'
-- Actual Select
SELECT b.ID, b.Identifier, b.DateAdded, DataColumn
FROM
(SELECT ID, Identifier, MAX(DateAdded) AS DateAdded
FROM #tmpTable
WHERE DateAdded < 16001
GROUP BY ID, Identifier) a
INNER JOIN #tmpTable b ON a.DateAdded = b.DateAdded
AND a.ID = b.ID
AND a.Identifier = b.Identifier
答案 1 :(得分:2)
您需要在表上创建一个不会用作聚合的主键列。然后,您可以创建CTE以选择所需的行,然后使用它来选择数据。
汇总函数MIN(ABS(15500 - DateAdded))
会将最接近的值返回到15500。
WITH g AS
(
SELECT MAX(UniqueKey) AS UniqueKey, ID, DataIdentifier, MIN(ABS(15500 - DateAdded)) AS "DateTest"
FROM test
GROUP BY ID, DataIdentifier
)
SELECT test.ID, test.DataIdentifier, test.DateAdded, test.DataColumn
FROM g
INNER JOIN test
ON g.UniqueKey = test.UniqueKey
修改强>
工作示例的屏幕截图:
答案 2 :(得分:0)
我认为在这种情况下,自我加入会是最好的,但我仍然没有得到最近和最低价值...(可能是15400)