0

日付フィールドと時刻フィールドの 2 つのフィールドがあり、どちらも文字列である、少し乱雑なテーブルを手に入れました。私がする必要があるのは、これらのフィールドから最小の日付を取得するか、日付/時刻が添付されていない場合はレコード自体を取得することです。サンプルデータは次のとおりです。

ID     First     Last     Date         Time
1      Joe       Smith    2013-09-06   04:00
1      Joe       Smith    2013-09-06   02:00
2      Jack      Jones            
3      John      Jack     2013-09-05   06:00
3      John      Jack     2013-09-15   15:00

クエリから欲しいのは、次のものを取得することです。

ID     First     Last     Date         Time
1      Joe       Smith    2013-09-06   02:00
2      Jack      Jones            
3      John      Jack     2013-09-05   06:00

ID 1 と 3 の最小の日付/時刻と、日付/時刻がないため、ID 2 だけが返されます。ID の 1 と 3 を希望どおりに正確に取得する次のクエリを思いつきました。

SELECT *
FROM test as t
where 
cast(t.date + ' ' + t.time as Datetime ) = (select top 1 cast(p.date + ' ' + p.time as Datetime ) as dtime from test as p where t.ID = p.ID order by dtime)

しかし、行番号 2 はまったく返されません。これを行うためのより良い方法があると思います。何か案は?

4

3 に答える 3

2

あなたはこれを行うことができますrow_number()

select ID, First, Last, Date, Time
from (select t.*,
             row_number() over (partition by id order by date, time) as seqnum
      from test t
     ) t
where seqnum = 1;

日付と時刻を文字列として保存することはお勧めしませんが、少なくとも正しく保存してください。値は ISO 標準形式 (またはそれに近い形式) を使用するため、アルファベット順の並べ替えは日付/時刻の並べ替えと同じです。

于 2013-08-23T19:02:00.867 に答える