SQL 之前的值

SQL previous value

我创建了一个 SQL 语句:

SELECT
    ROW_NUMBER() OVER (ORDER BY Q2.FUNCTIONAL_LOCATION) AS Rowy,
    Q1.FACT_MEASUREMENT_KEY,
    CONVERT(VARCHAR,Q1.Doc_Time,102) AS TIME
FROM 
    dbo.DIM_PROJECT_TECH_OBJ Q2 
INNER JOIN 
    dbo.FACT_MEASUREMENT Q1 ON (Q1.PROJECT_TECH_OBJ_KEY = Q2.PROJECT_TECH_OBJ_KEY)
WHERE 
    Q1.Measurement_Position  = 'XXX'

得到这个结果:

1   16124   08:00:00
2   53969   12:30:00
3   54282   17:15:00
4   55231   18:00:00
5   56196   15:00:00
6   16123   08:00:00
7   55393   12:30:00
8   55423   09:30:00
9   54283   08:00:00

我的目标是在每一行中获取 "Record-1" TIME(预计第一行会出错),如下所示:

1   16124   8:00:00 
2   53969   12:30:00    8:00:00
3   54282   17:15:00    12:30:00
4   55231   18:00:00    17:15:00
5   56196   15:00:00    18:00:00
6   16123   8:00:00 15:00:00
7   55393   12:30:00    8:00:00
8   55423   9:30:00 12:30:00
9   54283   8:00:00 9:30:00

我已经尝试使用失败了:

ROW_NUMBER() OVER (PARTITION BY Q1.FACT_MEASUREMENT_KEY ORDER BY Q1.FACT_MEASUREMENT_KEY ) AS RowP

但是我收到错误代码 102。

This version of SQL Server does not support LAG statements.

提前感谢任何suggestion/help。

规则

您可以通过对查询结果进行自联接来执行此操作:

WITH t as (
      SELECT ROW_NUMBER() OVER (ORDER BY Q2.FUNCTIONAL_LOCATION) AS Rowy,
             Q1.FACT_MEASUREMENT_KEY,
             CONVERT(VARCHAR(255), Q1.Doc_Time, 102) AS TIME
      FROM dbo.DIM_PROJECT_TECH_OBJ Q2 INNER JOIN
           dbo.FACT_MEASUREMENT Q1
           ON Q1.PROJECT_TECH_OBJ_KEY = Q2.PROJECT_TECH_OBJ_KEY
      WHERE Q1.Measurement_Position = 'XXX'
     )
select t.*, tprev.time
from t left join
     t tprev
     on tprev.rowy = t.rowy - 1;

当您升级到 SQL Server 2012+ 时,您可以将其替换为 lag()

此外,当您使用 varchar()(以及 SQL 服务器中的相关类型)时,请始终使用长度。 SQL 服务器在不同的上下文中有不同的默认长度 -- 在某些情况下默认值可能不够好。