比较Sql查询中的值

时间:2015-02-11 12:23:34

标签: sql sql-server tsql

我有一些表和SQL查询与join从这个表中选择。 查询结果如下:

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

我也知道案件何时,但我不知道如何比较价值观。正如我所见,最好的方法是遍历结果中的所有行。可能还有其他一些方法吗?

3 个答案:

答案 0 :(得分:2)

在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来执行相同的操作。

答案 1 :(得分:2)

如果您没有使用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

答案 2 :(得分:1)

使用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