0

以前の質問投稿でこの質問をしまし た日付範囲間の現在の値と以前の値を印刷しますが、 今回はここで日付範囲についてより具体的にしたいと思います。

ご覧のとおり、次のデータセットがあります。

    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=A ステータスが変更されていないことをステータスに表示したいので、その日付範囲に属していなくても、すべての ID の最後のレコードが表示される場合です。また、ID=C の両方が表示された場合、日付は日付範囲に属しているため、両方を出力します。

PS: DATE は DATE 形式であり、MS SQL です。

誰かがこれについて意見を述べていただければ幸いです。御時間ありがとうございます。

4

2 に答える 2

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
于 2012-05-27T18:22:32.727 に答える
0

SET DATEFORMAT ymd以下の and クエリを使用してみてください。

DATEFORMAT ymd

SELECT customerName 
FROM dbo.customer 
WHERE insertedDate BETWEEN '2010-04-01 'AND '2010-06-01'
于 2012-05-27T18:01:09.910 に答える