【问题标题】:Is there possible to use SQL Lag function itself?是否可以使用 SQL Lag 函数本身?
【发布时间】:2023-03-17 22:10:02
【问题描述】:

我需要为我的 SQL 报告问题找到解决方案。 我的问题与为来自lag 函数的列找到适当的方式使用lag 函数有关。

这是澄清我的问题的图片

【问题讨论】:

  • 样本数据最好显示为formatted text。请参阅here,了解有关如何创建漂亮表格的一些提示。
  • 我不知道我是否完全理解你的问题,但为什么不使用 CTE 呢?将第一个 LAG 放在 CTE 中,然后您可以使用第二个 LAG 再次查询它。 docs.microsoft.com/en-us/sql/t-sql/queries/…
  • 如上所述,我也经常使用 CTE/子查询和 LAG。第一个计算与最后一行或实际最后一行值的差异(通过任何逻辑),然后对其进行过滤,或者在您的情况下,您可以添加差异,例如 Column1+Diff
  • @MarcGuillot 你能举出更多使用第一和第二个 LAG 的实际例子吗?
  • @JerryHung 是的,但它总是会从第一个差异中获取电流,而不是第二个之前的计算。 ://

标签: sql sql-server lag cumulative-sum


【解决方案1】:

这看起来像是一个简单的累计。你不需要lag()。当在窗口定义中使用像 sum() 这样的聚合和 order by 时,它会为您提供。

但是您必须指定order by,因为表中的行没有任何隐含的顺序。

select column1, 
       sum(column1) over (order by ???) as column1_calculation
from the_table
order by ???

您需要将上述语句中的??? 替换为定义行排序顺序的列。很多时候,日期/时间列用于获取随时间推移的运行总数。

Online example

【讨论】:

  • 是的,我将日期作为列,但如果要替换 ???对于我的日期列,它只会按日期对 column1_calculation 进行分组。
  • 那么你的日期列对所有行都有相同的值,不适合order by,如果排序列有不同的值,它会按预期工作:dbfiddle.uk/…
  • 这对我来说没问题,但我需要在选择语句中包含日期列。如果我在你的例子中包含它,它不会返回正确的值。
  • @mp94:那么有些事情你没有告诉我们,因为包括日期列肯定不会改变任何事情:dbfiddle.uk/…
  • 您要按日期分区吗?因为我完全同意@a_horse_with_no_name,因为包含日期列不会影响您的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2016-10-25
  • 2021-11-14
  • 2023-03-04
  • 2018-08-01
  • 2020-10-30
相关资源
最近更新 更多