求复杂SQL问题,谢谢大家!

zhengkaining 2018-01-19 10:36:44
现有数据库

房型 日期(datetime) 状态
标间 2017/11/11 开放
标间 2017/11/12 开放
标间 2017/11/13 关闭
标间 2017/11/14 关闭
标间 2017/11/15 开放
标间 2017/11/16 关闭
标间 2017/11/17 开放
标间 2017/11/18 开放
标间 2017/11/19 开放
...

现要按照 房型 和 状态 分组后,合并相邻日期,产生日期区间 :
房型 开始日期 结束日期 状态
标间 2017/11/11 2017/11/12 开放
标间 2017/11/13 2017/11/14 关闭
标间 2017/11/15 2017/11/15 开放
标间 2017/11/16 2017/11/16 关闭
标间 2017/11/17 2017/11/19 开放

最好用SQL2000语法,谢谢大家!


...全文
216 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengkaining 2018-01-19
  • 打赏
  • 举报
回复
算法有错误,结果和希望得到结果不一致
zhengkaining 2018-01-19
  • 打赏
  • 举报
回复
这个不是2000的语法
听雨停了 2018-01-19
  • 打赏
  • 举报
回复
2000语法

use Tempdb
go
--> --> 听雨停了-->生成测试数据

if not object_id(N'Tempdb..#tab') is null
drop table #tab
Go
Create table #tab([房型] nvarchar(22),[日期(datetime)] Date,[状态] nvarchar(22))
Insert #tab
select N'标间','2017/11/11',N'开放' union all
select N'标间','2017/11/12',N'开放' union all
select N'标间','2017/11/13',N'关闭' union all
select N'标间','2017/11/14',N'关闭' union all
select N'标间','2017/11/15',N'开放' union all
select N'标间','2017/11/16',N'关闭' union all
select N'标间','2017/11/17',N'开放' union all
select N'标间','2017/11/18',N'开放' union all
select N'标间','2017/11/19',N'开放'
GO
--测试数据结束

;WITH cte AS (
SELECT [房型],
[日期(datetime)],
[状态],
rn = (
SELECT COUNT(1)
FROM #tab
WHERE [房型] = t.[房型]
AND [状态] = t.[状态]
AND [日期(datetime)] <= t.[日期(datetime)])
FROM #tab t
--ORDER BY [房型],[状态],[日期(datetime)]
)
SELECT a.[房型],
a.[日期(datetime)] as 开始日期,
isnull(b.[日期(datetime)],a.[日期(datetime)]) as 结束日期,
a.[状态]
FROM cte a
LEFT JOIN cte b
ON a.[房型] = b.[房型]
AND a.[状态] = b.[状态]
AND a.rn = b.rn -1
WHERE a.rn%2 <> 0
ORDER BY a.[房型],a.[状态],a.[日期(datetime)]

zhengkaining 2018-01-19
  • 打赏
  • 举报
回复
这个好多了,先谢谢你,但是不能跨年,跨月
听雨停了 2018-01-19
  • 打赏
  • 举报
回复
引用 3 楼 zhengkaining 的回复:
算法有错误,结果和希望得到结果不一致


use Tempdb
go
--> --> 听雨停了-->生成测试数据

if not object_id(N'Tempdb..#tab') is null
drop table #tab
Go
Create table #tab([房型] nvarchar(22),[日期(datetime)] Date,[状态] nvarchar(22))
Insert #tab
select N'标间','2017/11/11',N'开放' union all
select N'标间','2017/11/12',N'开放' union all
select N'标间','2017/11/13',N'关闭' union all
select N'标间','2017/11/14',N'关闭' union all
select N'标间','2017/11/15',N'开放' union all
select N'标间','2017/11/16',N'关闭' union all
select N'标间','2017/11/17',N'开放' union all
select N'标间','2017/11/18',N'开放' union all
select N'标间','2017/11/19',N'开放'
GO
--测试数据结束

--一直想着2000不能用Row_number(),却忘了也不能用cte。
--之前没注意看你要的结果,下面是新的算法
SELECT 房型,
状态,
MIN([日期(datetime)]) AS 开始日期,
MAX([日期(datetime)]) AS 结束日期
FROM (
SELECT [房型],
[日期(datetime)],
[状态],
DATEPART(YEAR, [日期(datetime)]) AS years,
DATEPART(MONTH, [日期(datetime)]) AS months,
DATEPART(DAY, [日期(datetime)]) as [days],
rn = (
SELECT COUNT(1)
FROM #tab
WHERE [房型] = t.[房型]
AND [状态] = t.[状态]
AND [日期(datetime)] <= t.[日期(datetime)]
)
FROM #tab t
) a
GROUP BY
房型,
状态,
years,
months,
([days]-rn)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧