【发布时间】:2014-10-31 04:08:53
【问题描述】:
我有一个测试 MySQL 语句如下:
SELECT
id, CCVisit, Admit, Discharge,
CASE
WHEN @prev_value = a.HospID THEN @rank_count:=@rank_count + 1
ELSE @rank_count:=1
END AS Rank,
@prev_value:=a.HospID as CurrentHospID,
CASE
WHEN @rank_count = 1 THEN @prev_date := Discharge
ELSE @prev_date
END AS PreviousDischarge,
@prev_date:=Discharge AS DischargeHolder
FROM
fusion.sqltest
INNER JOIN
(SELECT
HospID, Count(*) Frequency
FROM
fusion.sqltest
GROUP BY HospID
) AS a ON sqltest.HospID = a.HospID
它是针对一个非常简单的四列测试表运行的:
+----+---------+------------+------------+--------+
| id | CCVisit | Admit | Discharge | HospID |
+----+---------+------------+------------+--------+
| 5 | 1 | 2014-01-01 | 2014-01-03 | 1 |
| 6 | 2 | 2014-01-05 | 2014-01-06 | 1 |
| 7 | 3 | 2014-01-07 | 2014-01-08 | 1 |
| 8 | 4 | 2014-01-07 | 2014-01-10 | 2 |
+----+---------+------------+------------+--------+
寻找出院和随后使用相同 HospID 就诊之间的时间的想法。例如,CCVisti 1 和 2、2 和 3 但不是 3 到 4 之间的时间延迟(因为这是不同的 HospID。为此,我决定对入院进行排名(对于 HospID),保存之前的出院日期并最终(不包括在这里)计算之前记录出院日期(保存在@prev_date)和入院时间之间的每条记录的日期差异。我想我也可以在没有排名变量的情况下这样做?
代码似乎可以工作。
我现在需要将其转换为与 MS SQL 2005 一起使用。我遇到了各种各样的问题,包括无法在 select 语句中设置变量。这是我到目前为止所拥有的
DECLARE @prev_value AS int
DECLARE @rank_count AS int
DECLARE @prev_date AS smalldatetime
DECLARE @rank AS int
SELECT
*,
CASE
WHEN @prev_value = a.HospID THEN @rank + 1
ELSE 1
END AS Rank,
@prev_value=a.HospID ,
CASE
WHEN @rank_count = 1 THEN @prev_date = Discharge
ELSE @prev_date
END AS PreviousDischarge,
@prev_date:=Discharge AS DischargeHolder
FROM
dbo.sqltest
INNER JOIN
(SELECT
HospID , Count(*) Frequency
FROM
dbo.sqltest
GROUP BY HospID
HAVING COUNT(*) >=2
) AS a ON dbo.sqltest.HospID =a.HospID
我想我的第一个问题是 - 如何处理“@prev_value=a.HospID”类型的语句? MS SQL 给了我一个“为变量赋值的 SELECT 语句不能与数据检索操作结合使用”错误。任何指导表示赞赏!
【问题讨论】:
标签: mysql sql-server tsql