1

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

我要做的是,对于列表 (1,2) 中的每个 ID,以及 (1001,1002) 中的每个数据标识符 id,只返回第一个匹配字段 id 和日期最近且低于 16001 的行。

所以结果是:

1 | 1001 | 15400 | Newest Value
1 | 1002 | 16000 | Newest Value
2 | 1001 | 16000 | Newest Value

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

4

3 回答 3

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
于 2013-10-25T10:47:19.447 回答
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

编辑:

工作示例的屏幕截图:

在此处输入图像描述

于 2013-10-25T10:48:05.387 回答
0

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

于 2013-10-25T11:24:25.640 回答