自己加入下一个时间戳

时间:2015-04-23 13:11:32

标签: sql sql-server sql-server-2008

我希望根据Employee和punch card合并来自2个不同行的时间戳,但是如果我只使用>则max或limit不能与from语句一起使用然后我每天都会得到每一个...我希望自我加入的下一个更高的价值,我还要提到我必须使用SQL 2008!所以滞后和铅不起作用!

请帮帮我。

 SELECT , Det.name
          ,Det.[time]
          ,Det2.[time]
          ,Det.[type]
          ,det2.type
          ,Det.[detail]

      FROM [detail] Det
      join [detail] Det2 on 
      Det2.name = Det.name

      and
      Det2.time > Det.time Max 1

    where det.type <>3

    Table detail
    NAME | Time | Type | detail
    john | 10:30|  1   | On 
    steve| 10:32|  1   | On 
    john | 10:34|  2   | break
    paul | 10:35|  1   | On 
    steve| 10:45|  3   | Off
    john | 10:49|  2   | on
    paul | 10:55|  3   | Off
    john | 11:12|  3   | Off

通缉结果

John | 10:30 | 10:34 | 1 | 2 | On 
John | 10:34 | 10:49 | 2 | 1 | Break
John | 10:49 | 11:12 | 1 | 3 | on
Steve| 10:32 | 10:45 | 1 | 3 | on
Paul | 10:35 | 10:55 | 1 | 3 | On

提前谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用交叉申请:

SELECT Det.name
      ,Det.[time]
      ,ca.[time]
      ,Det.[type]
      ,ca.type
      ,Det.[detail]
FROM [detail] Det
Cross Apply(Select Top 1 * From detail det2 where det.Name = det2.Name Order By det2.Time) ca
Where det.Type <> 3

答案 1 :(得分:0)

正如您所说LAGLEAD函数不适合您,但您可以在两个表上使用ROW_NUMBER() OVER (PARTITION BY name ORDER BY time DESC),然后在JOIN上{ {1}}

这只是一个想法,但我不知道它为什么不能工作的问题。

<强>查询:

RN1 = RN2 + 1

<强>结果:

;WITH Data (NAME, TIME, type, detail)
AS (
    SELECT 'john', CAST('10:30' AS DATETIME2), 1, 'On'
    UNION ALL
    SELECT 'steve', '10:32', 1, 'On'
    UNION ALL
    SELECT 'john', '10:34', 2, 'break'
    UNION ALL
    SELECT 'paul', '10:35', 1, 'On'
    UNION ALL
    SELECT 'steve', '10:45', 3, 'Off'
    UNION ALL
    SELECT 'john', '10:49', 2, 'on'
    UNION ALL
    SELECT 'paul', '10:55', 3, 'Off'
    UNION ALL
    SELECT 'john', '11:12', 3, 'Off'
    )
SELECT t.NAME, LTRIM(RIGHT(CONVERT(VARCHAR(25), t.TIME, 100), 7)) AS time, LTRIM(RIGHT(CONVERT(VARCHAR(25), t2.TIME, 100), 7)) AS time, t.type, t2.type, t.detail
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY TIME) rn, *
    FROM Data
    ) AS t
INNER JOIN (
    SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY TIME) rn, *
    FROM Data
    ) AS t2
    ON t2.NAME = t.NAME
    AND t2.rn = t.rn + 1;

任何评论,疑虑 - 让我知道。 :)

答案 2 :(得分:0)

@ evaldas-buinauskas说, SQL中的OVERLAG语句适合您。

以下是一个类似的例子:

http://www.databasejournal.com/features/mssql/lead-and-lag-functions-in-sql-server-2012.html