我在之前的问题帖子上问了这个问题 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
如果有人可以对此采取行动,我将不胜感激。谢谢你的时间。
答案 0 :(得分:0)
尝试使用SET DATEFORMAT ymd
并在下方查询:
DATEFORMAT ymd
SELECT customerName
FROM dbo.customer
WHERE insertedDate BETWEEN '2010-04-01 'AND '2010-06-01'
答案 1 :(得分:0)
如果我理解正确,你想:
在这里,我正在调用您的源表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