【问题标题】:SQL inner join using multiple in statements on single table在单个表上使用多个 in 语句的 SQL 内连接
【发布时间】:2013-10-25 19:24:25
【问题描述】:

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

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

【问题讨论】:

  • 能否请您格式化不含 HTML 元素的表格?只需删除 HTML 元素,只保留文本,选择要显示为表格的文本,然后按 curly brackets 按钮。然后只需使用space bar 来调整格式。
  • 它真的应该是“最近的”15500 还是应该是 DateAdded 的最大/最新值?
  • 您的Date Added 列是否输入为整数?
  • @hallie 是的,对不起,这是我的一种类型,对不起。
  • @ChrisP 是的,添加日期列是一个整数。

标签: sql join inner-join


【解决方案1】:

似乎您想要 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

【讨论】:

  • 随时 :) 很高兴为您提供帮助
【解决方案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

编辑:

工作示例的屏幕截图:

【讨论】:

  • 嗨,克里斯,对不起,我应该提到我无法控制表结构,因此无法选择添加新键。我已经将上面的沙尔克斯答案作为问题答案。感谢您的帮助。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多