Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-在一个时间段内有X个以上实例的结果_Sql_Tsql_Date - Fatal编程技术网

SQL-在一个时间段内有X个以上实例的结果

SQL-在一个时间段内有X个以上实例的结果,sql,tsql,date,Sql,Tsql,Date,我正在处理一些与输血有关的实验室数据,需要提取在一定时间范围内发生的某些输血事件的统计数据 我需要找出哪些患者在4小时内输血3次或3次以上 我正在处理的数据中,每次输液都有一个行id、患者id、输液日期时间和一个输液产品 例如: 正如您可以从上面看到的,患者AB112符合我的选择标准,因为他们在相互之间的4小时内输注了4个单位,行1087441、1087443、1088208、1088408。一旦我有了这4行ID,我就可以带回患者和输血信息 我有一个问题,患者ID在患者的一生中一直与患者在一起,

我正在处理一些与输血有关的实验室数据,需要提取在一定时间范围内发生的某些输血事件的统计数据

我需要找出哪些患者在4小时内输血3次或3次以上

我正在处理的数据中,每次输液都有一个行id、患者id、输液日期时间和一个输液产品

例如:

正如您可以从上面看到的,患者AB112符合我的选择标准,因为他们在相互之间的4小时内输注了4个单位,行1087441、1087443、1088208、1088408。一旦我有了这4行ID,我就可以带回患者和输血信息

我有一个问题,患者ID在患者的一生中一直与患者在一起,因此他们可能会在医院接受每一次输血。有些患者非常频繁地需要大量输血

我最初将搜索限制在某个值之间的日期时间

从这里,我想查看所有唯一的患者ID,然后列出每次输血,然后逐一列举,以查看在4小时内是否存在3个或更多患者ID,并存储这些行ID以供使用,并带回其他信息

然而,我的问题存在,因为我不确定如何使用4小时的滚动时间跨度窗口来遍历患者的每个记录

请帮忙。多谢各位


编辑:使用SQL Server 2008 R2。

编辑:刚刚看到您的回复,您在2008 R2中。您可以执行相同的基本操作,但需要使用行号进行自联接,因为LAG不可用。我会看看我是否也能证明这一点

样本数据:

CREATE TABLE Transfusion (
  row_id INT
, patient_id VARCHAR(5)
, transfusion_datetime DATETIME
, blood_group VARCHAR(5)
, product VARCHAR(10)
)

INSERT INTO Transfusion VALUES 
(1085441,'AB112','2014-03-29 16:27:00.000','B POS','Red Cells')
,(1087441,'AB112','2014-03-30 21:11:00.000','B POS','Red Cells')
,(1087443,'AB112','2014-03-30 21:11:00.000','B POS','Red Cells')
,(1088208,'AB112','2014-03-30 22:32:00.000','B POS','Red Cells')
,(1088408,'AB112','2014-03-30 22:48:00.000','B POS','Red Cells')
,(1088693,'AB333','2014-03-30 19:25:00.000','O POS','Red Cells')
,(1089426,'AB333','2014-03-30 18:07:00.000','O POS','Red Cells')
,(1088529,'BB777','2014-03-30 11:12:00.000','B NEG','Red Cells')
,(1083933,'AB333','2014-03-30 09:31:00.000','O POS','Red Cells')
,(1083932,'AB333','2014-03-30 07:18:00.000','O POS','Red Cells')
如果使用SQL Server 2012+您可以使用LAG完成这种滚动窗口查询

;WITH cte AS (
  SELECT patient_id
        ,transfusion_datetime
        ,LAG(transfusion_datetime,2,0) OVER (PARTITION BY patient_id ORDER BY transfusion_datetime) transfusion_datetime_2_prior 
        --if the order of row_id is reliable then order the lag by that instead of transfusion_datetime
    FROM Transfusion   
)
SELECT patient_id
  FROM cte
 WHERE DATEDIFF(HOUR,transfusion_datetime_2_prior,transfusion_datetime) <=4
 GROUP BY patient_id
如果使用2005+您可以通过使用行号的自联接完成相同的任务:

;WITH cte AS (
  SELECT patient_id
        ,transfusion_datetime
        ,ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY transfusion_datetime) rn
        --if the order of row_id is reliable then order the lag by that instead of transfusion_datetime
    FROM Transfusion   
)
SELECT a.patient_id
  FROM cte a
       INNER JOIN
       cte b ON a.patient_id = b.patient_id
            AND a.rn = b.rn + 2
 WHERE DATEDIFF(HOUR,b.transfusion_datetime,a.transfusion_datetime) <=4
 GROUP BY a.patient_id
在任何一种情况下,您都可以通过将工作集首先限制为至少接受过三次输血的患者来获得性能提升,但我不确定查询优化器不会自行解决这一问题

这看起来像下面这样,但我会用真实数据测试这两种情况

;WITH PatientHaving3OrMore AS (
  SELECT patient_id
    FROM Transfusion
   GROUP BY patient_id
  HAVING COUNT(patient_id) > 2
)
,cte AS (
  SELECT a.patient_id
        ,transfusion_datetime
        ,ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY transfusion_datetime) rn
        --if the order of row_id is reliable then order the lag by that instead of transfusion_datetime
    FROM Transfusion a
   WHERE EXISTS(SELECT 1 FROM PatientHaving3OrMore b WHERE b.patient_id=a.patient_id)
)
SELECT a.patient_id
  FROM cte a
       INNER JOIN
       cte b ON a.patient_id = b.patient_id
            AND a.rn = b.rn + 2
 WHERE DATEDIFF(HOUR,b.transfusion_datetime,a.transfusion_datetime) <=4
 GROUP BY a.patient_id

你说的是tsql,这大大缩小了它的范围,但是你使用的是什么RDBMS和哪个版本?对不起,是SQLServer2008R2。我将更新问题。如果患者在4小时内输液超过3次,您将获得重复记录。但也许这样可以?例:在4小时内输5次血,同一个病人就有3条记录,仅在这4小时内。@Johan,你不应该得到重复的记录。这就是为什么我在最终选择中按患者id分组。嗨,卡尔,谢谢你提供的信息。我能够收回我需要的患者ID并处理这些问题,但我在下面有一个问题,关于如何仅获取这些患者的行ID,因为它们是唯一的,我无法进行分组或依靠它们。非常感谢。
;WITH PatientHaving3OrMore AS (
  SELECT patient_id
    FROM Transfusion
   GROUP BY patient_id
  HAVING COUNT(patient_id) > 2
)
,cte AS (
  SELECT a.patient_id
        ,transfusion_datetime
        ,ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY transfusion_datetime) rn
        --if the order of row_id is reliable then order the lag by that instead of transfusion_datetime
    FROM Transfusion a
   WHERE EXISTS(SELECT 1 FROM PatientHaving3OrMore b WHERE b.patient_id=a.patient_id)
)
SELECT a.patient_id
  FROM cte a
       INNER JOIN
       cte b ON a.patient_id = b.patient_id
            AND a.rn = b.rn + 2
 WHERE DATEDIFF(HOUR,b.transfusion_datetime,a.transfusion_datetime) <=4
 GROUP BY a.patient_id