如果不在日期范围内,则在日期范围和最后一条记录之间打印记录

时间:2012-05-27 17:48:39

标签: sql-server sql-server-2008 sql-server-2005

我在之前的问题帖子上问了这个问题 Printing the current value and previous value between the date range 但是这次我想在这里更具体地说明日期范围。

如您所见,我有以下数据集:

    ID     DATE           TIME     STATUS 
    ---------------------------------------------
    A      01-01-2000     0900     ACTIVE 
    A      05-02-2000     1000     INACTIVE 
    A      01-07-2000     1300     ACTIVE 
    B      01-05-2005     1000     ACTIVE 
    B      01-08-2007     1050     ACTIVE
    C      01-01-2010     0900     ACTIVE
    C      01-05-2010     0800     INACTIVE
    C      01-07-2010     1900     ACTIVE

我希望以下日期范围(01-04-2010至01-06-2010)之间的所有ID。输出应为:

ID     DATE           TIME     STATUS 
---------------------------------------------
A      01-07-2000     1300     ACTIVE 
B      01-08-2007     1050     ACTIVE
C      01-01-2010     0900     ACTIVE 
C      01-05-2010     0800     INACTIVE

这个想法是,如果您看到每个ID的最后一条记录,无论它是否属于该日期范围,因为我希望状态显示自该特定日期以来ID = A状态未发生变化。此外,如果您看到ID = C,则日期属于日期范围,因此应同时打印。

PS:DATE是DATE格式和MS SQL

如果有人可以对此采取行动,我将不胜感激。谢谢你的时间。

2 个答案:

答案 0 :(得分:0)

尝试使用SET DATEFORMAT ymd并在下方查询:

DATEFORMAT ymd

SELECT customerName 
FROM dbo.customer 
WHERE insertedDate BETWEEN '2010-04-01 'AND '2010-06-01'

答案 1 :(得分:0)

如果我理解正确,你想:

  1. 状态在指定范围内的任何ID,
  2. 最近的活动状态不在
  3. 在这里,我正在调用您的源表STATS

    DECLARE @START DATE = '1/4/2010';
    DECLARE @END DATE = '1/6/2010';
    
    ; WITH a AS (
        SELECT *,r=ROW_NUMBER()OVER(PARTITION BY [ID],[STATUS] ORDER BY [DATE] DESC, [TIME] DESC)
        FROM [STATS]
    )
    SELECT [ID], [DATE], [TIME], [STATUS] FROM a
    WHERE [DATE] BETWEEN @START AND @END
    
    UNION
    
    SELECT [ID], [DATE], [TIME], [STATUS] FROM a
    WHERE [STATUS]='ACTIVE'
    AND r=1;
    

    结果:

    ID   DATE       TIME STATUS
    ---- ---------- ---- ----------------
    A    2000-01-07 1300 ACTIVE
    B    2007-01-08 1050 ACTIVE
    C    2010-01-05 0800 INACTIVE
    C    2010-01-07 1900 ACTIVE