当前位置: 代码迷 >> Sql Server >> 问一个SQL语句,该怎么解决
  详细解决方案

问一个SQL语句,该怎么解决

热度:99   发布时间:2016-04-24 20:24:16.0
问一个SQL语句
问一个简单的SQL语句,请教各位大神。

RowId Id  Name  EditDate
1     11  Wang  2013/4/5
2     11  Wang  2013/5/31
3     11  Wang  2013/6/1
4     12  Zhang 2013/4/5
5     12  Zhang 2013/6/1


结果要求输出相同Id和Name最新一条。

------解决方案--------------------
select *
from
(select *,row_number() over (partition by  Id order by EditDate desc) re) a
where re=1
------解决方案--------------------
----------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-09-23 12:48:25
-- Version:
--      Microsoft SQL Server 2014 (CTP1) - 11.0.9120.5 (X64) 
-- Jun 10 2013 20:09:10 
-- Copyright (c) Microsoft Corporation
-- Enterprise Evaluation Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([RowId] int,[Id] int,[Name] varchar(5),[EditDate] datetime)
insert [huang]
select 1,11,'Wang','2013/4/5' union all
select 2,11,'Wang','2013/5/31' union all
select 3,11,'Wang','2013/6/1' union all
select 4,12,'Zhang','2013/4/5' union all
select 5,12,'Zhang','2013/6/1'
--------------开始查询--------------------------

select * 
from [huang] a
WHERE EXISTS (SELECT 1 FROM (SELECT id,name,MAX(editdate)editdate FROM huang GROUP BY id,name)b WHERE a.editdate=b.editdate AND a.id=b.id AND a.NAME=b.name)
----------------结果----------------------------
/* 
RowId       Id          Name  EditDate
----------- ----------- ----- -----------------------
3           11          Wang  2013-06-01 00:00:00.000
5           12          Zhang 2013-06-01 00:00:00.000
*/

------解决方案--------------------

;with cte(RowId,Id,Name,EditDate) as
(
select 1,11,'Wang','2013/4/5'
union all select 2,11,'Wang','2013/5/31'
union all select 3,11,'Wang','2013/6/1'
union all select 4,12,'Zhang','2013/4/5'
union all select 5,12,'Zhang','2013/6/1'
)
select RowId,Id,Name,EditDate
from
(
select *,rn=ROW_NUMBER() over(partition by Id,Name order by EditDate desc) from cte
)t
where rn=1

/*
RowId Id Name EditDate
3 11 Wang 2013/6/1
5 12 Zhang 2013/6/1
*/

------解决方案--------------------
--还有一种方法:


;with cte(RowId,Id,Name,EditDate) as
(
select 1,11,'Wang','2013/4/5'
union all select 2,11,'Wang','2013/5/31'
union all select 3,11,'Wang','2013/6/1'
union all select 4,12,'Zhang','2013/4/5'
union all select 5,12,'Zhang','2013/6/1'
)
select *
from cte a
where not exists (select 1 from cte b where a.Id=b.Id and a.Name=b.Name and b.EditDate>a.EditDate)

/*
RowId Id Name EditDate
3 11 Wang 2013/6/1
5 12 Zhang 2013/6/1
*/
  相关解决方案