根据两列和其他列选择不同的行

时间:2018-07-18 16:01:44

标签: sql sql-server sql-server-2012

我有一张这样的桌子

博客

Id  ColumnId DateCreated Type
1     1      2018-01-01   1
1     1      2018-01-02   2
1     1      2018-02-01   3

我需要基于IdColumnId的组合选择所有唯一的行。然后,它需要抓住我最新的日期和最大的Type。我似乎无法弄清楚。

我开始只是获得像这样的不同值:

SELECT Id, ColumnId
FROM Blog
GROUP BY Id, ColumnId

然后我想到,如果我可以自己加入,我可以抽出其余的,但是我没有运气怎么做到这一点

SELECT *
FROM ( SELECT Id, ColumnId
       FROM Blog
       GROUP BY Id, ColumnId) A
INNER JOIN Blog B ON A.Id = B.Id AND A.ColumnId = B.ColumnId

但这只是让我退回了所有3行。

在我的实际示例中,Id列不是int,而是uniqueidentifier。为了简单起见,我在示例中将其设为int。

预期结果样本:

Id  ColumnId DateCreated Type
1     1      2018-02-01   3

4 个答案:

答案 0 :(得分:2)

使用row_number()

select b.*
from (select b.*,
             row_number() over (partition by id, columnid order by date desc, type desc) as seqnum
      from blog b
     ) b
where seqnum = 1;

这会抓住最新日期中最大的类型,这就是我的解释“它需要抓住我最新日期和最大类型”。

答案 1 :(得分:2)

您是否尝试过使用MAX

SELECT Id, ColumnId, MAX(DateCreated), MAX([Type])
FROM Blog
GROUP BY Id, ColumnId

答案 2 :(得分:1)

似乎需要最后一个
您可以在最大日期内使用内部联接

select * from blog 
inner join  (
  select id, columnId, max(DateCreated) as max_date 
  from blog  
  group by id, columnId 

) t on t.id = blog.id, t.columnId = blog.columnId and t.max_date  = blog.DateCreated

答案 3 :(得分:0)

也许不是最佳解决方案,但是您可以尝试在查询中使用子选择。 像这样

1