【问题标题】:lag() and lead() sql server function to select data from diff tablelag() 和lead() sql server 函数从不同的表中选择数据
【发布时间】:2015-06-11 14:09:20
【问题描述】:

我需要帮助才能做到以下几点:

MainTable

ID (Primary Key)
DATE_TIME
STATE

子表

ID (Primary Key)
DATE_TIME
LINE1

MainTable.STATE值从100变为200时,我想选择SubTable.Line1值其中MainTable.DATE_TIME = SubTable.DATE_TIME

似乎LAG()LEAD() 函数可以检测到MainTable.STATE 字段中的数据转换。

如何使用LAG()LEAD() 函数对SQL 语句执行此操作?

感谢所有快速回复。由于 MainTable.STATE 的值可以是任何值,我不能在 sql stmt 中包含它的值。

【问题讨论】:

  • 考虑到 LAG 和 LEAD 函数仅适用于 SQL Server 2012 可能会有所帮助,否则您必须编写代码来模拟此操作。
  • 你是什么意思可能是任何东西

标签: sql-server lag lead


【解决方案1】:

这应该可以解决问题。

SELECT Line1
FROM SubTable s
INNER JOIN 
(
    SELECT DATE_TIME, State, LAG(State) OVER(ORDER BY DATE_TIME) as LastState
    FROM MainTable 
)
m
ON s.DATE_TIME = m.DATE_TIME
WHERE State = 200
AND LastState = 100

【讨论】:

    【解决方案2】:

    假设我理解你的问题,你可以这样做:

    select Line1
      from (
    select T1.[Id] as T1Id,
           T1.[Key] as T1Key,
           T1.[State] as T1State,
           T2.[Id] as T2Id,
           T2.[FKey] as T2Key,
           T2.[Line] as T2Line1,
           lag(T1.[State], 1, 100) OVER (order by T1.[Id]) as PriorState
      from T1
           left outer join T2 on T1.[Key] = T2.FKey
    ) as Data
     where [T1State] <> PriorState
       and [T1State] = 200
    

    【讨论】:

      【解决方案3】:

      这是一个解决方案:

      SELECT *, CASE WHEN State = 200 AND LAG(State) OVER(ORDER BY ID) = 100 
                     THEN (SELECT TOP 1 Line1 FROM SubTable WHERE DATE_TIME = m.DATE_TIME) END 
      FROM MainTable m
      

      【讨论】:

        猜你喜欢
        • 2018-12-12
        • 1970-01-01
        • 2016-09-19
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多