1

[重新构建先前的问题,该问题已作为关于光标的问题提出。]

我正在寻找一种在特定日期条件下选择计数的方法。

假设有一个表 ,T1有 2 个字段 ( ID, Date)。ID不是唯一键。该表按 id 记录事件,有些 id 经常发生,有些不经常发生。

例如:

ID  |  Date
1   |  2010-01-01
2   |  2010-02-01
3   |  2010-02-15
2   |  2010-02-15
4   |  2010-03-01

我想创建一个包含以下字段的新表:ID、日期、ID 出现在日期之前 6 个月内的次数、ID 出现在日期后 6 个月内的次数。

本质上,对于现有表中的每一行,我想添加一列,回顾过去六个月中出现相同 ID 的次数,并展望接下来六个月出现相同 ID 的次数。

因此,该示例的输出有望类似于:

ID  |  Date        | Lookback  |  Lookahead
1   |  2010-01-01  | 0         |  0
2   |  2010-02-01  | 0         |  1
3   |  2010-02-15  | 0         |  0
2   |  2010-02-15  | 1         |  0
4   |  2010-03-01  | 0         |  0

有没有最好的方法来制定适当的查询?

4

1 回答 1

3

您可以通过自加入来执行此操作(假设您有 KeyID 的主键):

SELECT  T.ID,
        T.Date,
        Lookback = COUNT(CASE WHEN t2.Date < T.Date THEN t2.ID END),
        Lookahead = COUNT(CASE WHEN t2.Date > T.Date THEN t2.ID END)
FROM    T
        INNER JOIN T t2
            ON t2.ID = t.ID
            AND t2.Date >= DATEADD(MONTH, -6, T.Date)
            AND T2.Date < DATEADD(MONTH, 6, T.Date)
GROUP BY T.ID, T.Date, T.KeyID;

SQL Fiddle 示例

关键是它只是加入了前 6 个月和后 6 个月的所有行,并计算结果。COUNT(CASE WHEN...确保对于该列before,您只计算之前的记录,而之后只计算之后的记录。

于 2013-09-09T15:57:40.450 回答