我有一个测试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和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语句,它为变量赋值不能与数据检索操作结合”错误。任何指导赞赏!
答案 0 :(得分:1)
据我所知,这是不可能的。因为查询是基于集合的(所有行都是同时处理的)所以你不能在查询中分配变量(我不熟悉mysql,但我很惊讶它可以在查询中处理变量赋值。但是mysql有许多让我感到惊讶的功能。
当然,您可以在RBAR查询中设置变量(例如,使用游标或while循环)。但是,这不会提高性能。 您还可以查看LAG函数以检索集合级别上的上一个日期(怀疑它是否在mssql 2005中可用),或使用CTE存储以前的值。
希望这有帮助。