[英]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.