繁体   English   中英

比较Sql查询中的值

[英]Compare values in Sql query

我有一些表和带有联接的sql查询,可以从这些表中选择。 查询结果如下:

number|name |value
------------------
1     |name1| 2.48
2     |name1| 1.32
3     |name1| 1.32

我需要重写此查询以添加另一个字段,具体取决于值字段的比较。 例如:如果是第一行,则需要0,如果先前的值较大,则需要1,否则为2。

结果我想看起来像这样:

number|name |value|status
--------------------------
1     |name1| 2.48|0
2     |name1| 1.32|2
3     |name1| 1.57|1

我也知道什么时候发生,但是我不知道如何比较值。 如我所见,最好的方法是遍历结果中的所有行。 可能还有其他方法吗?

在SQL Server 2012+中,可以使用lag()

select t.*,
       (case when lag(value) over (order by number) is null then 0
             when value > lag(value) over (order by number) then 1
             else 2
        end) as status
from table t;

在早期版本中,您可以使用相关子查询或outer apply来执行相同的操作。

如果您不使用MSSQL 2012+使用它。

你需要left join与同桌做到这一点。

;WITH cte
     AS (SELECT Row_number()OVER(partition BY name ORDER BY number) Rn,
                *
         FROM   Yourtable)
SELECT a.*,
       CASE
         WHEN b.rn IS NULL THEN 0
         WHEN a.value < b.value THEN 2
         ELSE 1
       END [Status]
FROM   cte a
       LEFT JOIN cte b
              ON a.Rn = b.Rn + 1 

或使用Outer Apply

SELECT a.number,a.name,a.value, CASE
             WHEN b.number IS NULL THEN 0
             WHEN a.value < b.value THEN 2
             ELSE 1
           END [Status]
FROM   Yourtable a
       OUTER apply (SELECT TOP 1 number,
                                 value
                    FROM   Yourtable  b
                    WHERE  a.name = b.name
                           AND a.number > b.number
                    ORDER  BY number DESC) b

使用Self Join

SELECT A.number, A.name, A.Value, 

               CASE WHEN A.Value ISNULL THEN 0
                    WHEN ISNULL(A.value, 0) > ISNULL(B.Value, 0) THEN 1 
                    ELSE 2 
                END AS Status 
    FROM Table AS A INNER JOIN Table AS B ON A.number - 1 = B.number

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM