我有这样的数据库表: default database picture
如果'Status'列为'good',我需要sql select查询来添加增量列值,如果'Bad',则需要获取先前的值。像这样:select query table
是否有选择查询来执行此操作?我使用sql Server Management Studio进行尝试查询。
谢谢您的帮助。
答案 0 :(得分:4)
假设您使用的是SQL Server的较新版本,则建议如下所示。 (请参阅SQL Fiddle,了解其工作原理。)
SELECT
id,
status,
sum(case when status='Good' then 1 end) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM test
ORDER by id
如果不清楚,sum
公式将在status='Good'
处计数为1(否则为0),并且over
子句告诉SQL Server我们关心的顺序是{{1 }}(升序),并且我们应该从开头(最低ID)到当前行求和。
如果您使用的SQL Server较旧版本无法完成id
(pre-2012 I think)的操作,或者您想要的外观更像基本SQL的东西,则可以考虑以下方法:
ROWS BETWEEN
这应该给您相同的结果,并使用相同的SELECT t1.id, t1.status, sum(case when t2.status='Good' then 1 end) as value
FROM test t1 inner join test t2
on t1.id >= t2.id
GROUP BY t1.id, t1.status
ORDER BY t1.id
公式,但是它将每个记录连接到同一表中的所有先前记录。希望对您有所帮助。
答案 1 :(得分:2)
尝试此答案,将Windows函数SUM
与带有OVER
的{{1}}子句一起使用就足够了(这里不需要ORDER BY
)
rows between