SQL内连接在单个表上使用多个in语句

时间:2013-10-25 10:14:12

标签: sql join inner-join

我正在尝试创建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

我尝试了几种连接方式,但我一直在返回重复记录。任何建议或帮助将不胜感激。

3 个答案:

答案 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

修改

工作示例的屏幕截图:

enter image description here

答案 2 :(得分:0)

我认为在这种情况下,自我加入会是最好的,但我仍然没有得到最近和最低价值...(可能是15400)