当前位置: 首页 > 面试题库 >

SQL-如何查询TSQL中的重新入学?

终安和
2023-03-14
问题内容

我试图弄清楚如何在Server
2008r2上查询重新入职。这是访问表的基本结构。还有其他领域,但我认为没有任何帮助。一个问题是,其中一些可能是转移而不是排放,我没有简单的方法可以推断出来,但是现在这个问题可以忽略不计。我尝试了一下,但是我想我对SQL的理解需要更多的工作。我试图找到我可以在线上找到的任何信息,但是没有一个查询使我得出一个有用的结论,或者我只是不明白。任何建议,将不胜感激。

编辑:重新入院是指患者在上次出院前30天内返回。

+---------+--------+-----------------+-----------------+
| VisitID |  UID   |     AdmitDT     |   DischargeDT   |
+---------+--------+-----------------+-----------------+
|      12 | 2      | 6/17/2013 6:51  | 6/17/2013 6:51  |
|      16 | 3      | 6/19/2013 4:48  | 6/21/2013 13:35 |
|      18 | 3      | 6/11/2013 12:08 | 6/11/2013 12:08 |
|      21 | 3      | 6/12/2013 14:40 | 6/12/2013 14:40 |
|      22 | 3      | 6/13/2013 10:00 | 6/14/2013 12:00 |
|      25 | 2      | 6/11/2013 16:13 | 6/11/2013 16:13 |
|      30 | 1      | 6/20/2013 8:35  | 6/20/2013 8:35  |
|      31 | 7      | 6/13/2013 6:12  | 6/13/2013 6:12  |
|      34 | 3      | 6/12/2013 8:40  | NULL            |
|      35 | 1      | 6/12/2013 8:52  | NULL            |
|      38 | 2      | 6/12/2013 10:10 | 6/12/2013 10:10 |
+---------+--------+-----------------+-----------------+

尝试输入代码:

SELECT N2.*
FROM visitTable AS N1
INNER JOIN
visitTable AS N2 ON N1.UID = N2.UID
WHERE N1.EncounterID <> N2.EncounterID AND ( N2.AdmitDT BETWEEN N1.DischargeDT and DATEADD(DD,30, N1.DischargeDT))

问题答案:

这是一个开始:

sqlfiddle

新提琴

它按照admitDT的顺序获取每个UID的每次访问,然后将每次访问与该结果中的下一次访问配对。如果当前的入学日期在最后的出院日期和从那时起的30天之间,请选择它。但是有一些奇怪的地方-
UID 1已显示已于2012年12月12日入学,从未出院,但随后在2013年6月20日再次入学,并于同一天出院。

编辑:进行了一些重组,以减少联接的数量

WITH cte AS (
  SELECT visitid,uid,dischargedt,admitdt,
    row_number()over(partition BY uid ORDER BY admitdt) AS r
  FROM t
  )
SELECT
c1.visitid AS v1, c2.visitid AS v2,
c1.uid,
c1.dischargedt as [Discharged from first visit],
c2.admitdt as [Admitted to next visit]
FROM cte c1
INNER JOIN cte c2 ON c1.uid=c2.uid
WHERE c1.visitid<>c2.visitid
AND c1.r+1=c2.r
AND c2.admitdt BETWEEN c1.dischargedt AND dateadd(d,30,c1.dischargedt )
ORDER BY c1.uid

结果

| V1 | V2 | UID | DISCHARGED FROM FIRST VISIT |      ADMITTED TO NEXT VISIT |
|----|----|-----|-----------------------------|-----------------------------|
| 25 | 38 |   2 | June, 11 2013 16:13:00+0000 | June, 12 2013 10:10:00+0000 |
| 38 | 12 |   2 | June, 12 2013 10:10:00+0000 | June, 17 2013 06:51:00+0000 |
| 18 | 34 |   3 | June, 11 2013 12:08:00+0000 | June, 12 2013 08:40:00+0000 |
| 21 | 22 |   3 | June, 12 2013 14:40:00+0000 | June, 13 2013 10:00:00+0000 |
| 22 | 16 |   3 | June, 14 2013 12:00:00+0000 | June, 19 2013 04:48:00+0000 |


 类似资料:
  • 问题内容: 我有如下查询 我想以某种方式重用 我简化了上面的查询,但是实际上上面的选择是巨大而复杂的。我不想负担确保两者同步 我没有任何以编程方式重用它的方法。排除了T-SQL。我只能写简单的查询。这是应用程序的限制。 有没有一种方法可以在单个语句中重用相同的子查询 问题答案: 如果您使用的是SQL Server 2005+,请使用公用表表达式(CTE):

  • 问题内容: 考虑一下我有这行代码 恕我直言,这很容易受到SQL注入的攻击。 因此,我想通过Get / URL发送一个“ var”参数来证明它是可以尝试的,该参数将注入查询,并带有潜在的恶意代码。 我实际上尝试过: 我尝试在执行之前打印出SQL字符串查询,它实际上是2条SQL有效语句。 第一个问题,但实际上似乎mysqli-> query不会一次执行2条语句。是不是 第二个问题,我看到注入查询的一种

  • 问题内容: 我是hive的新手,想知道是否有像在SQL中一样将数据插入到hive表中的方法。我想像我的蜂巢中插入我的数据 我已经读过您可以将文件中的数据加载到配置单元表中,也可以将数据从一个表导入到配置单元表中,但是有什么方法可以像在SQL中那样附加数据吗? 问题答案: 自Hive 0.14起,此处的某些答案已过时 https://cwiki.apache.org/confluence/displ

  • 问题内容: 我想编写一个包含NodeJS变量的SQL查询。当我这样做时,它给我一个错误“未定义”。 我希望下面的SQL查询能够识别该变量。如何将NodeJS变量输入到SQL查询中?它周围是否需要特殊字符,例如或。 问题答案: 您将需要将变量的 值 放入SQL语句中。 这不好: 这将起作用,但是从SQL注入攻击中并不安全: 为了防止SQL注入,您可以像这样转义您的价值: 但是最好的方法是使用参数替换

  • 问题内容: 我有一个包含三列的表: 还有另一个表,其中包含2列。的列与的相同。 我需要一个查询,它将更新带有的列。 我可以通过检查ID并执行更新语句来通过循环来实现。如何才能通过查询完成? 问题答案: 怎么样

  • 假设我有一个表,它有两列X1和X2,其中X1总是小于X2。每行构成一定的范围(X1,X2)。可能有几行的X1/X2范围重叠,从而产生更大的范围(X1n,X2m)。 有没有办法使用标准SQL查询来查找所有这些范围? 例如,该表可能如下所示: 预期产出将是: 我非常感谢您在正确方向上对我们的帮助。 我正在使用sqlite。