2017-01-13 5 views
0

SQLサーバ:SQL:特定の値が見つかった場合IDに与えられた他のすべての値を無視

所定のテーブルはIDの一つの列、整数値の一つの列と日付の列を有し、かつ値がIDに与えられた時刻。したがって、1つのIDは複数の対応する値を持つことができます。

id Value datetime  
---|-----|------------------------ 
1 | 10 | 04/03/2009 10:12:33.000 
2 | 13 | 05/02/2009 11:02:03.000 
1 | 20 | 10/10/2009 13:22:45.000 
1 | 15 | 12/03/2010 15:12:33.000 
2 | 19 | 25/05/2009 10:12:33.000 
2 | 17 | 09/06/2009 17:18:45.000 

値20はID用に見つかった場合は、同じIDを持つ他のすべての行を無視します。それ以外の場合は、idに与えられた最後の値を表示します。

結果:

id Value datetime  
---|-----|------------------------ 
2 | 17 | 09/06/2009 17:18:45.000 
+0

をどこTOPとの条件(1) –

+0

シンプルを使用しますが、私は以上の2つのIDを持っているとき、私は何をしますか。私はそれが最後に与えられた値を持つすべてのIDを返すし、値の1つが20のときに完全に無視したい。 – Phil

+0

IDの数が多い場合には期待通りの結果を投稿することができます。 – Susang

答えて

0

ROW_NUMBERNOT EXISTSとランクで出フィルタ:

DECLARE @t TABLE (id INT, v INT, d DATETIME) 
INSERT INTO @t 
VALUES (1, 10, '2009-03-04 10:12:33.000'), 
     (2, 13, '2009-02-05 11:02:03.000'), 
     (1, 20, '2009-10-10 13:22:45.000'), 
     (1, 15, '2010-03-12 15:12:33.000'), 
     (2, 19, '2009-05-25 10:12:33.000'), 
     (2, 17, '2009-06-09 17:18:45.000'); 


WITH cte 
      AS (SELECT * , 
         ROW_NUMBER() OVER (PARTITION BY id ORDER BY d DESC) AS rn 
       FROM  @t t 
       WHERE NOT EXISTS (SELECT * 
            FROM @t 
            WHERE id = t.id 
              AND v = 20) 
      ) 
    SELECT * 
    FROM cte 
    WHERE rn = 1 
+0

ありがとうございました!それは仕事をするでしょう。 – Phil

0

は、あなたが条件をフィルタリングするNOT INLEFT JOINを使用して願っています。データを

SELECT TOP 1 * 
FROM YourTable WHERE Id NOT IN (
SELECT Id FROM YourTable WHERE Value = 20) 
ORDER BY Value DESC 

サンプルの実行:

DECLARE @YourTable TABLE (id INT, Value INT, datetime DATETIME) 
INSERT INTO @YourTable (id, Value, datetime) 
SELECT 1 , 10 , '2009-03-04 10:12:33.000' UNION 
SELECT 2 , 13 , '2009-02-05 11:02:03.000' UNION 
SELECT 1 , 20 , '2009-10-10 13:22:45.000' UNION 
SELECT 1 , 15 , '2010-03-12 15:12:33.000' UNION 
SELECT 2 , 19 , '2009-05-25 10:12:33.000' UNION 
SELECT 2 , 17 , '2009-06-09 17:18:45.000' 

SELECT TOP 1 * 
FROM @YourTable WHERE Id NOT IN (
SELECT Id FROM @YourTable WHERE Value = 20) 
ORDER BY Value DESC 
+0

しかし、私は2つ以上のIDを持っている場合、これはすべてのIdに対して与えられた最後の値を返しません。 Additonally IDの最後の日付と時刻を何らかの形でフィルタリングする必要があります。 – Phil

0

使用ROW_NUMBERをし、IDによるグループのPARTITIONとDESC順の日時で最後insetred値を選択

あなたは以下のクエリを試すことができます。

select id, value, datetime from (
     select ROW_NUMBER() over(PARTITION by id Order by id,datetime desc) as row_rank, id, value, datetime 
     from tbl_1 
    ) as A 
    where row_rank=1 
0
SELECT Top 1 * 
FROM @YourTable 
Group by id, Value, datetime 
Having Value<20 
ORDER BY Value DESC 
+4

少なくともコードの最小限の説明は素晴らしいでしょう。 – bansi

関連する問題