在SQL中的SELECT中设置变量

时间:2014-10-31 04:08:53

标签: mysql sql-server tsql

我有一个测试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语句,它为变量赋值不能与数据检索操作结合”错误。任何指导赞赏!

1 个答案:

答案 0 :(得分:1)

据我所知,这是不可能的。因为查询是基于集合的(所有行都是同时处理的)所以你不能在查询中分配变量(我不熟悉mysql,但我很惊讶它可以在查询中处理变量赋值。但是mysql有许多让我感到惊讶的功能。

当然,您可以在RBAR查询中设置变量(例如,使用游标或while循环)。但是,这不会提高性能。 您还可以查看LAG函数以检索集合级别上的上一个日期(怀疑它是否在mssql 2005中可用),或使用CTE存储以前的值。

希望这有帮助。