我来SQL有很多必要的经验,并试图弄清楚如何做到感觉它需要一个没有SQL循环的循环。也就是说,在SQL中循环使用命令式语言时,什么是不循环的习惯用法?如何不在SQL中循环使用集合
我在SQL(服务器)的表像这样(假设我们选择其中的标签ID是999,和inc_indx是自动递增)
inc_indx | State | Tag_Id
400 5 999
399 3 "
397 0 "
395 50 "
392 39 "
...etc
从本质上讲,一时间状态的增加,然后不可预知的零。我想获得给定集合中每个零值之前的最后一个值。
要做到这一点有一次,我这样做:
SELECT TOP 1 [State]
FROM [mytable]
WHERE [inc_indx] <
(SELECT TOP 1 [inc_ndx]
FROM [mytable]
WHERE Tag_Id = 999
AND State = 0)
AND Tag_Id = 999
要反复这样做,在必要pythonish伪代码,并假设某种类型的数据库连接处理类的,我这样做:
setOfZeroes = handler.query("SELECT [inc_ndx]
FROM [mytable]
WHERE Tag_Id = 999
AND State = 0")
setOfMaxes = []
for index in setOfZeroes:
max = handler.query("SELECT TOP 1 [State]
FROM [mytable]
WHERE [inc_indx] < "
+ index +
" AND Tag_Id = 999")
setOfMaxes.add(max)
但是,假设我想在SQL中完成所有操作,并且我不想循环,那么SQLese的方式是什么?
答:
短版:热膨胀系数与连接
长版(其中有些可能是不必要的):
-- narrow the scope, add a numbered row
WITH numbered AS (SELECT [State]
,inc_indx
,ROW_NUMBER() OVER (Order by inc_indx) As [row]
FROM mytable
WHERE Tag_Id = 999)
-- put the row numbers where state is zero in a second CTE
, zeroes AS (SELECT [row]
FROM numbered
WHERE State = 0)
SELECT [State], [inc_indx]
FROM numbered, zeroes
WHERE numbered.[row] = zeroes.[row] - 1
ORDER BY [inc_indx] desc
我想我解释自己做得不好。我已更新。 – anthropomo
不完全是答案,但这让我在那里。 – anthropomo