2012-05-27 2 views
0

Я задал этот вопрос на своем предыдущем вопросном поста 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 

Я хочу все ID между этим следующим диапазоном дат (01.04.2010 до 01.06.2010). Вывод должен быть:

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 = Статус не изменился. Кроме того, если вы видите ID = C, то и дата относится к диапазону дат, поэтому напечатайте оба.

PS: дата в формате DATE и в MS SQL

Я был бы признателен, если кто может дать их взять на это. Спасибо за ваше время.

ответ

0

Попробуйте использовать SET DATEFORMAT ymd и запрос ниже:

DATEFORMAT ymd 

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

Это напечатает диапазон дат между датой, указанной ... Но я хочу, чтобы последняя запись каждого ID .. Пожалуйста, смотрите вопрос – Afaq

+0

Добро пожаловать в StackOverflow: если вы отправляете код, XML или образцы данных **, пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ('{}') на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис! –

0

Если я правильно понимаю, вы хотите:

  1. Любой ID, чей статус в пределах указанного диапазона, и
  2. Самый последний активный статус не в

Здесь я вызываю вашу исходную таблицу 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 
Смежные вопросы