/*
My Sql Server Version:Microsoft SQL Server 2012
The code below can run at above 2005
*/
--Step1:Initialize DataTable
select * from (VALUES(1,cast('1 JAN 2016' as Date),'AC')
,(2,cast('1 JAN 2016'as Date),'AC')
,(3,cast('1 JAN 2016'as Date),'Non AC')
,(1,cast('2 JAN 2016'as Date),'AC')
,(3,cast('2 JAN 2016'as Date),'AC')
,(1,cast('3 JAN 2016'as Date),'AC')
,(2,cast('3 JAN 2016'as Date),'AC')
,(3,cast('3 JAN 2016'as Date),'Non AC')
) as a(RoomNo,Date,Type)
-- result
/*
RoomNo Date Type
----------- ---------- ------
1 1 JAN 2016 AC
2 1 JAN 2016 AC
3 1 JAN 2016 Non AC
1 2 JAN 2016 AC
3 2 JAN 2016 AC
1 3 JAN 2016 AC
2 3 JAN 2016 AC
3 3 JAN 2016 Non AC
(8 row(s) affected)
*/
--Step2: The Result
--Solution A:
;with FilterResult as (
select RoomNo,Type,Row_Number() over(partition by RoomNo order by Date) as rn
from (VALUES(1,cast('1 JAN 2016' as Date),'AC')
,(2,cast('1 JAN 2016'as Date),'AC')
,(3,cast('1 JAN 2016'as Date),'Non AC')
,(1,cast('2 JAN 2016'as Date),'AC')
,(3,cast('2 JAN 2016'as Date),'AC')
,(1,cast('3 JAN 2016'as Date),'AC')
,(2,cast('3 JAN 2016'as Date),'AC')
,(3,cast('3 JAN 2016'as Date),'Non AC')
) as a(RoomNo,Date,Type)
)
select RoomNo,Type
from FilterResult
where rn = 3
--result
/*
RoomNo Type
----------- ------
1 AC
3 Non AC
(2 row(s) affected)
*/
--Solution B:
;with SourceTable as(
select * from (VALUES(1,'1 JAN 2016','AC')
,(2,'1 JAN 2016','AC')
,(3,'1 JAN 2016','Non AC')
,(1,'2 JAN 2016','AC')
,(3,'2 JAN 2016','AC')
,(1,'3 JAN 2016','AC')
,(2,'3 JAN 2016','AC')
,(3,'3 JAN 2016','Non AC')
) as a(RoomNo,Date,Type)
),
FilterResult as (
select RoomNo,max(Date) as Date from SourceTable
group by RoomNo
having count(Date) =3
)
select a.RoomNo,b.Type
from FilterResult as a inner join SourceTable as b on a.RoomNo = b.RoomNo and a.Date = b.Date
--Result
/*
RoomNo Type
----------- ------
1 AC
3 Non AC
(2 row(s) affected)
*/
назначение школы? Что вы пробовали? (Возможно, 'GROUP BY'?) – jarlh
Использовать' GROUP BY Type' нет? – simon
Какая группа Не проверяет всю датированную дату –