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 服务器在不同的上下文中有不同的默认长度 -- 在某些情况下默认值可能不够好。
我创建了一个 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 服务器在不同的上下文中有不同的默认长度 -- 在某些情况下默认值可能不够好。