基本上,首先我需要SELECT
Rank
,PERSONID
和AddressID
的最低PhoneType
。如果有多行具有相同的Rank
,那么我需要返回最大VerificationDate
的行,然后获得最终输出。
创建语句:
CREATE TABLE AddressPhone ([PERSONID] [varchar](10) NOT NULL,
[AddressID] [int] NOT NULL,
[PhoneType] [varchar](2) NOT NULL,
[PhoneNumber] [varchar](15) NOT NULL,
[VerificationDate] [datetime] NOT NULL,
[Rank] [int] NOT NULL) ON [PRIMARY];
答案 0 :(得分:1)
尝试此查询:
样本数据(不相同,但等效):
declare @tbl table (personid int, addressid int, phonetype bit, phonenumber int, verificationdate date, rank int);
insert into @tbl values
(1, 1, 0, null, '2014-06-24', 4),
(1, 1, 1, null, '2014-06-24', 4),
(1, 1, 1, null, '2014-06-24', 4),
(1, 1, 1, null, '2014-06-24', 4),
(1, 1, 1, null, '2014-06-24', 4),
(1, 1, 0, null, '2014-06-24', 4),
(1, 1, 0, null, '2014-06-24', 3),
(1, 1, 0, null, '2014-06-24', 4),
(1, 1, 1, null, '2014-06-24', 2),
(1, 1, 1, null, '2014-06-24', 1),
(1, 1, 0, null, '2014-06-24', 4),
(1, 1, 1, null, '2014-06-24', 4),
(2, 2, 0, null, '2014-06-24', 2),
(2, 2, 0, null, '2014-06-24', 1),
(2, 2, 0, null, '2014-06-24', 4),
(2, 2, 1, null, '2014-06-25', 1),
(2, 2, 1, null, '2014-06-24', 1);
--intermediate step
select personid, addressid, phonetype, phonenumber, verificationdate, rank,
row_number() over (partition by rank order by verificationdate) rnVerDate
from (
select personid, addressid, phonetype, phonenumber, verificationdate, rank,
row_number() over (partition by personid, addressid, phonetype order by rank desc) rnRank
from @tbl
) a where rnRank = 1
--final result
select personid, addressid, phonetype, phonenumber, verificationdate, rank
from (
select personid, addressid, phonetype, phonenumber, verificationdate, rank,
row_number() over (partition by rank order by verificationdate) rnVerDate
from (
select personid, addressid, phonetype, phonenumber, verificationdate, rank,
row_number() over (partition by personid, addressid, phonetype order by rank desc) rnRank
from @tbl
) a where rnRank = 1
) a where rnVerDate = 1