2016-12-13 27 views
0

毎日max(batchid)の行を選択する必要があります。SQL Serverのテーブルから複数の最大行を選択する方法

サンプルテーブル:

Id | BatchId |Date     |KeyValue 
-- | --------|---------------------|----------- 
1 | 1  | 2016-12-13 12:30:66 |1234 
2 | 1  | 2016-12-13 12:30:66 |5654 
3 | 2  | 2016-12-13 08:30:66 |1234 
4 | 2  | 2016-12-13 08:30:66 |5654 
5 | 1  | 2016-12-12 12:10:45 |1234 
6 | 1  | 2016-12-12 12:10:45 |5634 
7 | 2  | 2016-12-12 08:10:45 |1234 
8 | 2  | 2016-12-12 08:10:45 |5634 
9 | 3  | 2016-12-12 04:10:45 |9628 

予想される出力:事前に

Id | BatchId |Date     |KeyValue 
-- | --------|---------------------|----------- 
3 | 2  | 2016-12-13 08:30:66 |1234 
4 | 2  | 2016-12-13 08:30:66 |5654 
9 | 3  | 2016-12-12 04:10:45 |9628 

ありがとう!

+0

あなたは毎日言って、あなたの出力は2つの2016年12月13日ですか?また、これまでに試したことを私たちに見せてください。 – Anand

+0

@SqlZimそれは... '2016-12-13'の2行にbatchId = 2があり、' 2016- 12-12' –

+1

ようこそStackOverflowへ!良い質問をするためのヒントは[ask]にチェックしてください。この場合、@Anandが述べたように、コード・フォー・ミーサービスではなく、これがQ&Aサイトであるため、うまくいかないコードを提供する方がよいでしょう。 – Kateract

答えて

0

使用max() over . . .

select t.* 
from (select t.*, max(date) over (partition by cast(date as date)) as maxdate 
     from sample t 
    ) t 
where maxdate = date; 

あるいは、rank()/dense_rank()

select t.* 
from (select t.*, 
      dense_rank() over (partition by cast(date as date) order by date desc) as seqnum 
     from sample t 
    ) t 
where seqnum = 1; 
+0

Sql Serverは 'cast(date as date)'を許可していますか? –

0

訂正とゴードン・リノフの拡大:

rextester:http://rextester.com/GECAZ46515

create table BatchKeys (Id int,BatchId int,Date datetime,KeyValue int) 
insert into BatchKeys (Id,BatchId,Date,KeyValue) values 
(1,1,'2016-12-13T12:30:06',1234) 
,(2,1,'2016-12-13T12:30:06',5654) 
,(3,2,'2016-12-13T08:30:06',1234) 
,(4,2,'2016-12-13T08:30:06',5654) 
,(5,1,'2016-12-12T12:10:45',1234) 
,(6,1,'2016-12-12T12:10:45',5634) 
,(7,2,'2016-12-12T08:10:45',1234) 
,(8,2,'2016-12-12T08:10:45',5634) 
,(9,3,'2016-12-12T04:10:45',9628) 


select t.* 
from (select t.*, max(BatchId) over (partition by cast(date as date)) as maxBatchId 
     from BatchKeys t 
    ) t 
where maxBatchId = BatchId; 

select t.* 
from (select t.*, 
      dense_rank() over (partition by cast(date as date) order by BatchId desc) as seqnum 
     from BatchKeys t 
    ) t 
where seqnum = 1; 

select top 1 with ties t.* 
from BatchKeys t 
order by dense_rank() over (partition by cast(date as date) order by BatchId desc) 
関連する問題