SQL获取前一行的小时数

时间:2014-11-19 13:55:00

标签: sql mysqli oracle-sqldeveloper

我正在处理一个查询,该查询提取有关商店开仓和关闭时间的信息。这是结果集:

RTL_LOC_ID TRANS_TYPCODE                  BEGIN_DATETIME            
---------- ------------------------------ ---------------------------
      2390 WORKSTATION_OPEN               14.10.01 09:53:43,121000000 
      2390 WORKSTATION_CLOSE              14.10.01 23:51:49,729000000 
      2390 WORKSTATION_OPEN               14.10.02 09:57:47,768000000 
      2390 WORKSTATION_CLOSE              14.10.02 23:47:00,120000000 
      2390 WORKSTATION_OPEN               14.10.03 09:47:38,949000000 
      2390 WORKSTATION_CLOSE              14.10.03 23:45:42,602000000 

选择了6行

这是查询:

SELECT RTL_LOC_ID,TRANS_TYPCODE, BEGIN_DATETIME
FROM TRN_TRANS
WHERE(trans_typcode = 'WORKSTATION_OPEN' OR trans_typcode='WORKSTATION_CLOSE')
AND BUSINESS_DATE BETWEEN '14.10.01 00:00:00' AND '14.10.03 00:00:00'
ORDER BY BUSINESS_DATE, BEGIN_DATETIME ASC;

因此,我需要计算商店开盘和关闭之间的小时数,并将该值放入新列中。我还想把当天的结果放在同一行,而不是每天两行。

由于

2 个答案:

答案 0 :(得分:0)

这个答案假定 MySQL ,因为问题没有用Oracle开头标记。我在这里留下这个答案,因为它可能会激发具有Oracle技能的人找到解决方案......

假设某个位置在关闭之前总是打开,那么快速而肮脏的解决方案可能如下所示:

SELECT RTL_LOC_ID, DATE(BUSINESS_DATE), 
    MIN(BUSINESS_DATE) AS [OpenTime],
    MAX(BUSINESS_DATE) AS [CloseTime]
FROM 
    TRN_TRANS
WHERE(trans_typcode = 'WORKSTATION_OPEN' OR trans_typcode='WORKSTATION_CLOSE')
AND BUSINESS_DATE BETWEEN '14.10.01 00:00:00' AND '14.10.03 00:00:00'
GROUP BY RTL_LOC_ID, DATE(BUSINESS_DATE)
ORDER BY DATE(BUSINESS_DATE)

或者如果你想变得迂腐:

SELECT RTL_LOC_ID, DATE(BUSINESS_DATE), 
    MAX(CASE trans_typcode WHEN 'WORKSTATION_OPEN' THEN BUSINESS_DATE ELSE NULL END) AS [OpenTime],
    MAX(CASE trans_typcode WHEN 'WORKSTATION_CLOSE' THEN BUSINESS_DATE ELSE NULL END) AS [CloseTime],
FROM
    -- rest of query same as above --

答案 1 :(得分:0)

这是你的意思吗?

SELECT
TRN_TRANS.RTL_LOC_ID,
DATE_FORMAT(BEGIN_DATETIME ,'%Y-%m-%d') AS _date,
TIMEDIFF(closing_time.BEGIN_DATETIME , opening_time.BEGIN_DATETIME ) AS _hours
FROM TRN_TRANS

INNER JOIN
    (
        SELECT RTL_LOC_ID, BEGIN_DATETIME, DATE_FORMAT(BEGIN_DATETIME ,'%Y-%m-%d') as _date
        FROM TRN_TRANS
        WHERE TRANS_TYPCODE = 'WORKSTATION_OPEN'
    ) AS opening_time
ON 
TRN_TRANS.RTL_LOC_ID = opening_time.RTL_LOC_ID
AND
DATE_FORMAT(TRN_TRANS.BEGIN_DATETIME ,'%Y-%m-%d') = opening_time._date


INNER JOIN
        (
            SELECT RTL_LOC_ID, BEGIN_DATETIME, DATE_FORMAT(BEGIN_DATETIME ,'%Y-%m-%d') as _date
            FROM TRN_TRANS
            WHERE TRANS_TYPCODE = 'WORKSTATION_CLOSE'
        ) AS closing_time
ON
TRN_TRANS.RTL_LOC_ID = closing_time.RTL_LOC_ID
AND
DATE_FORMAT(TRN_TRANS.BEGIN_DATETIME ,'%Y-%m-%d') = closing_time._date

GROUP BY TRN_TRANS.RTL_LOC_ID, _date, _hours