sql - T-SQL - 按最近日期选择并按 ID 分组

标签 sql sql-server sql-server-2005 tsql

我需要使用 SQL Server 2005 从下面的数据中为每个链接 ID 选择最接近指定日期的记录:

ID     Date      Linked ID
...........................
1    2010-09-02     25
2    2010-09-01     25
3    2010-09-08     39
4    2010-09-09     39
5    2010-09-10     39
6    2010-09-10     34
7    2010-09-29     34
8    2010-10-01     37
9    2010-10-02     36
10   2010-10-03     36

因此使用 01/10/2010 选择它们应该返回:

1    2010-09-02     25 
5    2010-09-10     39
7    2010-09-29     34 
8    2010-10-01     37
9    2010-10-02     36

我知道这一定是可能的,但我似乎无法理解它(一定是太接近一天结束的时候了:P)如果有人可以帮助我或在正确的方向上轻轻地推我一下,那就会了不胜感激!

编辑:我还遇到过这个sql来获取最接近的日期:

abs(DATEDIFF(minute, Date_Column, '2010/10/01'))

但无法弄清楚如何正确地合并到查询中...

谢谢

最佳答案

你可以试试这个。

DECLARE @Date DATE = '10/01/2010';

WITH cte AS
    (
    SELECT ID, LinkedID, ABS(DATEDIFF(DD, @date, DATE)) diff,
        ROW_NUMBER() OVER (PARTITION BY LinkedID ORDER BY ABS(DATEDIFF(DD, @date, DATE))) AS SEQUENCE
    FROM MyTable
    )

SELECT *
FROM cte
WHERE SEQUENCE = 1
ORDER BY ID
;

您没有指明如何处理 LinkedID 组中的多行代表最接近目标日期的情况。此解决方案将仅包含一行,并且在这种情况下,您无法保证包含多个有效值中的哪一行。

如果您想要包含表示最接近值的所有行,可以在查询中将 ROW_NUMBER() 更改为 RANK()。

关于sql - T-SQL - 按最近日期选择并按 ID 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4649665/

相关文章:

mysql - SQL Null 作为 0 并使用 Left Join?

php - 如何在sql查询中设置变量

sql - 从 column1 中删除最后 2 位数字并将这 2 位数字附加到 column2

c# - 使用 SQL Server 数据事件进行消息传递

sql - 如何用单引号插入文本sql server 2005

mysql - 稍后在查询中使用 AS 值

sql - 如何将数据库中的所有 sql server management studio 事件作为可执行的 mssql 日志获取?

PHP 字节数组转 Base64(来自 Mssql 的字节数组)

c# - MaskedTextBox 如果为空,则将 NULL 插入 SQL

asp.net - 使用配置更改默认的SqlCommand CommandTimeout而不是重新编译?