sqlserver:如何在一定条件下获取最新的行?

pdkcd3nj  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(290)

我不熟悉使用sql进行数据转换。我正在努力用stage=draft或finish获取最新数据。谁能给我一些建议吗?
由此:

Name | Stage   | UpdateDate |
-----+---------+------------+
a    | draft   | 8/17/2014  |
a    | draft   | 8/25/2014  |
a    | finish  | 8/25/2014  |
b    | draft   | 2/14/2015  |
b    | draft   | 2/15/2015  |
b    | draft   | 2/16/2015  |

对此:

Name | Stage   | UpdateDate |
-----+---------+------------+
a    | draft   | 8/25/2014  |
a    | finish  | 8/25/2014  |
b    | draft   | 2/16/2015  |
xlpyo6sf

xlpyo6sf1#

以下假设您需要每个名称/草稿对的最新行(我就是这样理解问题的):
一个简单的方法是关联子查询:

select t.*
from t
where t.updatedate = (select max(t2.updatedate)
                      from t t2
                      where t2.name = t.name and t2.stage = t.stage
                     );

另一个好方法是使用窗口函数:

select t.*
from (select t.*, row_number() over (partition by name, stage order by updatedate desc) as seqnum
      from t
     ) t
where seqnum = 1;

如果您真的希望所有行的名称都具有最新的总体日期,那么您可以对这些行进行调整。例如:

select t.*
from (select t.*, rank() over (partition by name order by updatedate desc) as seqnum
      from t
     ) t
where seqnum = 1;
6yt4nkrj

6yt4nkrj2#

试试这个

SELECT *
FROM tblFoo
WHERE [UpdateDate] in (SELECT MAX(UpdateDate)
                FROM tblFoo
                Group by [Name], [Stage])

结果如下:

uurity8g

uurity8g3#

select top 1 with ties 
   *
from 
    YourTable
order by 
    row_number() over(partition by Name, Stage order by UpdateDate desc)

更新(完整答案):

declare @Table table (
    [Name]      char(1)     not null,
    Stage       varchar(6)  not null,
    UpdateDate  date        not null
);

insert into @Table
values 
( 'a', 'draft'  , '2014-8-17'  ),
( 'a', 'draft'  , '2014-8-25'  ),
( 'a', 'finish' , '2014-8-25'  ),
( 'b', 'draft'  , '2015-2-14'  ),
( 'b', 'draft'  , '2015-2-15'  ),
( 'b', 'draft'  , '2015-2-16'  );

select top 1 with ties 
   [Name],
   Stage,
   UpdateDate = convert(varchar(10), UpdateDate, 101)
from 
    @Table
order by 
    row_number() over(partition by Name, Stage order by UpdateDate desc);

在sql fiddle中也是如此
top 1在这里使用领带。with ties意味着当order by=1时,select将获取此记录(因为前1条记录)以及order by=1的所有其他记录(因为with ties记录)。

相关问题