我有一些表和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
我也知道案件何时,但我不知道如何比较价值观。正如我所见,最好的方法是遍历结果中的所有行。可能还有其他一些方法吗?
答案 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