2016-06-17 13 views
1

私は上の意思決定を作りたい二つのフィールドを持つテーブルがあります、T-SQL:最大日付に基づいて行を選択する方法は?

- DATE 
- DATE_LOADED 

私は(多くの関連する行を有していてもよい)DATEがあるかどうかを知りたい、「2016-06-15」と言うが2つの一意のDATE_LOADEDエントリ('2016-06-16''2016-06-17')がある場合は、MAX DATE_LOADED行のみを使用します。

実際には、同じ日に重複するデータが2つ報告されています。後のレポートは修正です。すべての列が更新されている可能性がありますが、DATEです。

はASK:
各DATE(だけでなく、それぞれの個々の線)はDATEどこDATE_LOADED = MAX DATE_LOADEDために関連付けられすべての行を取るその後存在する場合、複数のDATE_LOADEDがあるかどうかを確認するためその特定の日付。

+2

データサンプルを提供してくださいし、必要な出力結果と、あなた自身のアトムを提供する場合はgreateになります – Vasily

答えて

3

これは、ウィンドウ関数を使用して行うことができ

select * 
from (
    select t.*, 
      row_number() over (partition by date order by date_loaded desc) as rn 
    from the_table t 
) x 
where rn = 1; 

複数の行がある場合同じ最大日付を持つ場合、上記のいずれかが返されます。あなただけの単一DATE_LOADEDと日付をフィルタリングする場合は、あなたがにクエリを高めることができる

select * 
from (
    select t.*, 
      max(date_loaded) over (partition by date) as max_date_loaded 
    from the_table t 
) x 
where date_loaded = max_date_loaded; 

:あなたはすべてをしたい場合は、このようなものを使用することができます

select * 
from (
    select t.*, 
      max(date_loaded) over (partition by date) as max_date_loaded, 
      count(*) over (partition by date) as cnt 
    from the_table t 
) x 
where date_loaded = max_date_loaded 
    and cnt > 1; 
+0

これは素晴らしいことです、ありがとう!私は同じ最大日付の複数の行があるので、2番目の例を取っ​​た。それが問題のポイントでした。あなたのコードでは、4行目の 'order'の後にいくつかの単語がありません。何かでそれを注文するかorderキーワードを削除しますが、それは動作しません。ありがとう! –

+0

@ ColinO'Brien:ありがとうございました。 'max()'は 'order by 'を全く必要としません。 –

0

私はあなたが

Select Date,MAX(DateLoaded) 
From TableName  
Group By Date 
3

の下にこのクエリは、あなたにその日付の異なるDATE_LOADED値の合計数、およびそれらのレコード間で最大DATE_LOADED値をDATEのリストを取得するようなものの後にあると信じています。

SELECT DATE 
    , COUNT(DISTINCT DATE_LOADED) AS [Total Different DATE_LOADED Values] 
    , MAX(DATE_LOADED) AS [Max DATE_LOADED] 
FROM YOURTABLE 
GROUP BY DATE 
HAVING COUNT(DISTINCT DATE_LOADED) > 1 

私は、そのDATE、どこDATE_LOADED = MAX DATE_LOADEDその特定の日付のに関連付けられているすべての行を取る

に後でこれを見ました。

これは、上記のクエリをテーブルに戻すことで実現できます。これにより、前のクエリで一致する元のテーブルのすべてのレコードの結果が得られます。

1

この目的でCROSS APPLYまたはINNER JOINを使用できます。以下はCROSS APPLYの例です。問い合わせの上

DATE  DATE_LOADED 
2016-06-15 2016-06-16 
2016-06-15 2016-06-17 
2016-06-15 2016-06-18 
2016-06-15 2016-06-18 

はあなたを与えるだろう:例えば

SELECT t.[DATE], 
     t.DATE_LOADED  
FROM YourTable t 
CROSS APPLY (
    SELECT MAX(DATE_LOADED) as MAX_DATE_LOADED 
    FROM YourTable 
    WHERE [DATE] = t.[DATE]) as p 
WHERE t.DATE_LOADED = p.MAX_DATE_LOADED 

は、あなたのテーブルでのようなものがあるかどう

DATE  DATE_LOADED 
2016-06-15 2016-06-18 
2016-06-15 2016-06-18 
関連する問題