【问题标题】:SQL Server CE: calculate same column values (problems are null's after deleting rows)SQL Server CE:计算相同的列值(删除行后问题为空)
【发布时间】:2016-11-27 14:23:54
【问题描述】:

我想在 SQL Server CE 中计算相同的列值。问题是null's 删除行后,因为 id 不按顺序排列:1,2,3,4,5... 它们是 1,2,3,5,6...

截图:http://imgur.com/rHKaPwX

查询

SELECT  
    t2.id, t2.datum,
    t2.stanjekm,
    t2.tocenolit,
    t2.stanjekm - t1.stanjekm as PredjenoKm
FROM
    Gorivo AS t1 
RIGHT JOIN
    Gorivo AS t2 ON t1.id = t2.id-1

如何插入这个id:

SELECT MAX(id) 
FROM gorivo 
WHERE id NOT IN (SELECT MAX(id) FROM gorivo)

代替:

t2.id-1

【问题讨论】:

  • 我根据图片添加了SQL Server标签
  • @GordonLinoff:但屏幕截图显示连接到“SQL Server Compact” - 使用sql-server-ce 标签而不是sql-server

标签: sql sql-server-ce delete-row subtraction


【解决方案1】:

您实际上是在寻找查看前一行值的 LAG 函数。
如您所见,无需自行加入。

LAG (Transact-SQL)

SELECT  id, 
        datum,
        stanjekm,
        tocenolit,
        stanjekm - lag (stanjekm,1,0) over (order by id) as PredjenoKm
FROM Gorivo as 

;with    t as
        (
                SELECT  id, 
                        datum,
                        stanjekm,
                        tocenolit,
                        stanjekm,
                        row_number () over (order by id) as rn

                FROM Gorivo as 
        )

select  t1.id, 
        t1.datum,
        t1.stanjekm,
        t1.tocenolit,
        t1.stanjekm - isnull(t2.stanjekm,0)
from    t as t1 left join t as t2 on t2.rn = t1.rn - 1

【讨论】:

  • 这似乎是一个优雅的解决方案,但我使用的是 sql Compact CE 3.5,我认为 LAG 是在 sql 2012 中引入的。
  • 解析查询时出错。 [令牌行号=1,令牌行偏移量=1,错误令牌=带有]
  • 1) 在我们转向另一个问题之前,请批准当前的解决方案。 2)您评论中的代码与这篇文章有什么关系? 3) 为什么你还在使用 RIGHT JOIN?
【解决方案2】:

听起来您担心删除一行时“丢失”的 ID。简单的答案是:不用担心它们。

id 定义为identity 列,让它为新行分配新数字。无需担心行中的间隙。事实上,填充它们会删除标识列的一个非常强大的特性——它们会枚举行插入到表中的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多