注册 登录
编程论坛 SQL Server论坛

在sql server中,要求在一个10000条医院就诊记录中,将两个月内出现6次的和六个月出现8次的病人输出到单独的两个表格中。求算法

gaointer 发布于 2012-06-04 19:08, 1599 次点击
在sql server中,要求在一个10000条医院就诊记录中,将两个月内出现6次的和六个月出现8次的病人输出到单独的两个表格中。求算法!!!!
14 回复
#2
shangxisen2012-06-05 00:11
程序代码:
create table JZJL
(
JZ_TIME  DATETIME,---就诊时间
JZ_NAME VARCHAR(20)---病人名称
)

INSERT INTO JZJL VALUES('20110101','A')
INSERT INTO JZJL VALUES('20110201','A')
INSERT INTO JZJL VALUES('20110101','A')
INSERT INTO JZJL VALUES('20110101','A')
INSERT INTO JZJL VALUES('20110101','A')
INSERT INTO JZJL VALUES('20110101','A')
INSERT INTO JZJL VALUES('20110501','B')
INSERT INTO JZJL VALUES('20110601','B')
INSERT INTO JZJL VALUES('20110601','B')
INSERT INTO JZJL VALUES('20110601','B')
INSERT INTO JZJL VALUES('20110601','B')
INSERT INTO JZJL VALUES('20110601','B')
INSERT INTO JZJL VALUES('20110601','A')
INSERT INTO JZJL VALUES('20110601','A')




 /*两个月出现6次*/

 SELECT T.JZ_NAME FROM

 (SELECT MAX(JZ_TIME) MINTIME,MIN(JZ_TIME) MAXTIME,JZ_NAME FROM JZJL

 WHERE JZ_NAME IN (SELECT JZ_NAME FROM JZJL GROUP BY JZ_NAME HAVING COUNT(1)=6)

 GROUP BY JZ_NAME)T  WHERE DATEDIFF(MONTH,T.MINTIME,T.MAXTIME)<2


 /*6个月出现8次*/
  SELECT T.JZ_NAME FROM

 (SELECT MAX(JZ_TIME) MINTIME,MIN(JZ_TIME) MAXTIME,JZ_NAME FROM JZJL

 WHERE JZ_NAME IN (SELECT JZ_NAME FROM JZJL GROUP BY JZ_NAME HAVING COUNT(1)=8)

 GROUP BY JZ_NAME)T  WHERE DATEDIFF(MONTH,T.MINTIME,T.MAXTIME)<6
楼主看看对你有没有帮助
#3
gaointer2012-06-05 17:51
回复 2楼 shangxisen
太有用了,十分感谢!
#4
gaointer2012-06-05 19:51
回复 2楼 shangxisen
继续求助。。我将您的CODE套入我的数据库中,但是关于时间还是有问题,第一个选出来的有不是两个月内的。请帮我看看是否是我没有套用正确。谢谢!

我的数据是从CSV文件中导入的,一共是1W条
NI是病人编号,
TreatmentID是诊断编号,
AdmissionDate是就诊日期

程序代码:
create database PatientAdmissions
go

use PatientAdmissions
create table PatientAdmissionsData
(TreatmentID  int NOT NULL PRIMARY KEY
, NI int not null
, Gender varchar(1) not null
, AdmissionDate date not null
, AdmissionType VARCHAR(20) NOT NULL
, Treatment varchar(20) not null
)

BULK INSERT PatientAdmissionsData
FROM 'C:\Users\20021939\Desktop\04062012\PatientAdmissionsData10k.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO

alter table PatientAdmissionsData add Flag int

select * from PatientAdmissionsData


/*2个月出现6次以及以上*/
SELECT NI FROM
(SELECT MAX(AdmissionDate) MINTIME,MIN(AdmissionDate) MAXTIME,NI FROM PatientAdmissionsData
WHERE NI IN (SELECT NI FROM PatientAdmissionsData GROUP BY NI HAVING COUNT(1)>=6)
GROUP BY NI)T  WHERE DATEDIFF(MONTH,T.MINTIME,T.MAXTIME)<2

/*6个月出现8次以及以上*/
  SELECT NI FROM
(SELECT MAX(AdmissionDate) MINTIME,MIN(AdmissionDate) MAXTIME,NI FROM PatientAdmissionsData
WHERE NI IN (SELECT NI FROM PatientAdmissionsData GROUP BY NI HAVING COUNT(1)>=8)
GROUP BY NI)T  WHERE DATEDIFF(MONTH,T.MINTIME,T.MAXTIME)<6

SELECT AdmissionDate FROM PatientAdmissionsData
WHERE NI= 18


令:我自己研究了下,您的这个CODE是否是默认从每个病人第一次就诊开始算两月内是否来了6次? 如果是,那任意两月的时间CODE应该怎样写??谢谢!

[ 本帖最后由 gaointer 于 2012-6-5 20:41 编辑 ]
#5
cnfarer2012-06-05 21:17
这个似乎没有那么简单
#6
gaointer2012-06-05 21:29
回复 5楼 cnfarer
呵呵,是版主大大,能否给点提示?很急啊!!
#7
png2012-06-05 23:01
如果病人1月份来了2次5月份来了4次, 算符合条件么?
#8
shangxisen2012-06-06 00:06
回复 4楼 gaointer
您说的任意两个月是指在表中的日期范围内,任意指定两个月的时间?
在SQL中传递两个参数(开始月份,结束月份)么?
#9
gaointer2012-06-06 05:07
回复 8楼 shangxisen
我不是很清楚您是什么意思,但是要求是,任意两个月里,病人就诊次数有并且超过6次的。例入9月15-11月15病人甲来过6次或以上,这个就算。谢谢!

[ 本帖最后由 gaointer 于 2012-6-6 05:16 编辑 ]
#10
gaointer2012-06-06 05:07
回复 7楼 png
谢谢您的回复!这个不算,是在任意两个月内来六次。是从一个病人某一次就诊开始算,未来两个月中是否能有6次或以上。

[ 本帖最后由 gaointer 于 2012-6-6 05:18 编辑 ]
#11
png2012-06-06 23:47
回复 10楼 gaointer
是不是可以理解成,任意连续60天内同一病人出现的次数至少6次哪?
#12
gaointer2012-06-07 06:07
回复 11楼 png
谢谢回复。基本上可以这样理解,但有一个问题是连续的两个月有可能是61天,有可能是62天,也有可能是59天
#13
png2012-06-07 10:40
是不是可以这样, 没测试哈 -

select    a.NI
from      PatientAdmissionsData a join PatientAdmissionsData b
          on b.NI = a.NI and
             b.AdmissionDate > a.AdmissionDate and  b.AdmissionDate < dateadd(m, 2, a.AdmissionDate)
group by  a.NI, a.AdmissionDate
having    count(*) > 5


[ 本帖最后由 png 于 2012-6-7 11:37 编辑 ]
#14
gaointer2012-06-07 17:29
回复 13楼 png
十分感谢您的回答,今天MS一位高手说是
要设置两个循环了
内循环 计算两个月内出现6次的和六个月出现8次的病人 将符合条件的病人ID插入制定表中
外循环 就是从指定月份开始搜索 循环增加 起始月份+1 直到当前日期的前6个月为止

请求给位高手们给点具体的提示!
#15
png2012-06-07 21:47
你不会没试一下我举例的CODE?  效果应该不比那位MS高手的建议差.  不信你再问一问他/她?  

另外我也没看出MS高手所建议外循环的必要性.



[ 本帖最后由 png 于 2012-6-7 21:48 编辑 ]
1