求一个统计的算法

空中猎手 2009-03-24 10:20:03
技术问题:
表名:病人检查表
字段:病历号 病人姓名 检查项目 检查日期

现在要求统计一年中,有哪些病人在10天内重复检查了2次、3次、5次相同的检查。
这个SQL怎么写?

竟量给简单写法,偶也不想用存储过程之类的实现~~
...全文
107 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldleft_hxb 2009-03-24
  • 打赏
  • 举报
回复
学习下
LIHY70 2009-03-24
  • 打赏
  • 举报
回复
学习下~~~
等不到来世 2009-03-24
  • 打赏
  • 举报
回复
select * from 病人检查表 t
where
(
select count(1) from 病人检查表
where year(检查日期)=year(t.检查日期)
and abs(datediff(d,检查日期,t.检查日期))<10
and 检查项目=t.检查项目
)=2 --3,5
中国风 2009-03-24
  • 打赏
  • 举报
回复
SELECT 
a.病人姓名
from
病人检查表 a
inner join
病人检查表 b on a.病人姓名=b.病人姓名 and a.检查项目=b.检查项目 and datediff(d,a.检查日期,b.检查日期)<10 and a.检查日期!=b.检查日期
inner join
病人检查表 c on c.病人姓名=b.病人姓名 and c.检查项目=b.检查项目 and datediff(d,a.检查日期,c.检查日期)<10 and c.检查日期 not in(a.检查日期,b.检查日期)
where a.检查日期 >='20090101' and b.检查日期<='20091231' and c.检查日期<='20091231'
union
SELECT
a.病人姓名
from
病人检查表 a
inner join
病人检查表 b on a.病人姓名=b.病人姓名 and a.检查项目=b.检查项目 and datediff(d,a.检查日期,b.检查日期)<10 and a.检查日期!=b.检查日期
where a.检查日期 >='20090101' and b.检查日期<='20091231'
union
SELECT
a.病人姓名
from
病人检查表 a
inner join
病人检查表 b on a.病人姓名=b.病人姓名 and a.检查项目=b.检查项目 and datediff(d,a.检查日期,b.检查日期)<10 and a.检查日期!=b.检查日期
inner join
病人检查表 c on c.病人姓名=b.病人姓名 and c.检查项目=b.检查项目 and datediff(d,a.检查日期,c.检查日期)<10 and c.检查日期 not in(a.检查日期,b.检查日期)
inner join
病人检查表 d on d.病人姓名=b.病人姓名 and d.检查项目=b.检查项目 and datediff(d,a.检查日期,d.检查日期)<10 and d.检查日期 not in(a.检查日期,b.检查日期,c.检查日期)
inner join
病人检查表 e on e.病人姓名=b.病人姓名 and e.检查项目=b.检查项目 and datediff(d,a.检查日期,e.检查日期)<10 and e.检查日期 not in(a.检查日期,b.检查日期,c.检查日期,d.检查日期)
where
a.检查日期 >='20090101' and b.检查日期<='20091231' and c.检查日期<='20091231' and d.检查日期<='20091231' and e.检查日期<='20091231'
中国风 2009-03-24
  • 打赏
  • 举报
回复
這樣?
以有3次為例
SELECT 
distinct a.*
from
病人检查表 a
inner join
病人检查表 b on a.病人姓名=b.病人姓名 and a.检查项目=b.检查项目 and datediff(d,a.检查日期,b.检查日期)<10 and a.检查日期!=b.检查日期
inner join
病人检查表 c on c.病人姓名=b.病人姓名 and c.检查项目=b.检查项目 and datediff(d,a.检查日期,c.检查日期)<10 and c.检查日期 not in(a.检查日期,b.检查日期)
where a.检查日期 >='20090101' and b.检查日期<='20091231' and c.检查日期<='20091231'
中国风 2009-03-24
  • 打赏
  • 举报
回复
SELECT 
病人姓名,DATEPART(wk, 检查日期),检查项目
from
病人检查表
group by 病人姓名,DATEPART(wk, 检查日期) ,检查项目
having count(*) in(2,3,5)
dawugui 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
不用存储过程就得用触发器.
[/Quote]
错了,不用存储过程就得用油标.
dawugui 2009-03-24
  • 打赏
  • 举报
回复
不用存储过程就得用触发器.
jinjazz 2009-03-24
  • 打赏
  • 举报
回复
任意10天这个比较麻烦
dawugui 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 tompkins2000 的帖子:]
技术问题:
表名:病人检查表
字段:病历号 病人姓名 检查项目 检查日期

现在要求统计一年中,有哪些病人在10天内重复检查了2次、3次、5次相同的检查。
这个SQL怎么写?

竟量给简单写法,偶也不想用存储过程之类的实现~~
[/Quote]
不想用存储过程?

估计做不到.


请给出表结构,测试数据,相关算法和需要的结果.谢谢!

happysophie 2009-03-24
  • 打赏
  • 举报
回复

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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