【问题标题】:Setting variables within a SELECT in TSQL在 SQL 中的 SELECT 中设置变量
【发布时间】: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


    【解决方案1】:

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 2013-03-12
      • 2011-09-03
      • 1970-01-01
      • 2020-06-19
      相关资源
      最近更新 更多