我有一个带有以下数据的Sql Server 2005表:
idHearing是主键(identity),idCase是可能重复的外键。 StartDate和StartTime指定事件的日期和时间 - 两个字段都是DateTime类型(无论出于何种原因,这些字段都是单独的字段)。所有StartDate数据的时间均为12:00:00。所有StartTime数据的日期均为1/1/1900。 IsScheduled和IsOnCalendar是位字段。
我的挑战是为每个idCase选择最新的(在日期/时间方面)听证会。如果StartDate / StartTime相同(如第1行和第2行中所示),则应优先选择启用了IsScheduled和/或IsCalendar的行。如果这些列也是相同的,那么返回哪一行并不重要。
为了使这更复杂,我必须在单个SELECT语句中完成所有操作(因为它必须在视图中)并且我必须返回您在下面看到的所有列。
我尝试了几种方法,但我的SQL-FU并不强大。有什么想法吗?
答案 0 :(得分:4)
使用:
CREATE VIEW vw_summary AS
WITH example AS (
SELECT t.idcase,
t.startdate,
t.startime,
t.isscheduled,
t.isoncalendar,
ROW_NUMBER() OVER (PARTITION BY t.idcase ORDER BY t.startdate DESC,
t.starttime DESC,
t.isscheduled DESC,
t.isoncalendar DESC) AS rank
FROM TABLE t)
SELECT e.*
FROM example e
WHERE e.rank = 1
检查&看 - 可能会调整ROW_NUMBER上的ORDER BY ...
答案 1 :(得分:2)
与omg ponies的回答非常相似。 Row_number是你的朋友。我不完全确定位字段是否按照您的要求处理,但您明白了。与以往一样,最好明确你所选择的领域,但我很懒。
create table #table
(
idHearing int,
idCase int,
startDate datetime,
starttime datetime,
isscheduled bit,
isoncalendar bit
);
insert into #table values(1,1,'8/2/2010','3:30:00 PM',1,1)
insert into #table values(2,1,'8/2/2010','3:30:00 PM',1,0)
insert into #table values(3,2,'8/3/2010','5:30:00 PM',1,1)
insert into #table values(4,2,'8/4/2010','9:30:00 PM',1,1)
insert into #table values(5,3,'8/2/2010','3:00:00 PM',1,1)
select * from
(
select
row_number()
over
(partition by idcase order by
startdate desc,
starttime desc,
isscheduled desc,
isoncalendar desc
) idCasePosition,
*
from #table
) x
where idCasePosition=1
drop table #table