查询以从表中获取持续时间和详细信息

时间:2009-12-12 01:16:11

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

我有一个场景,不太确定如何查询它。作为一个示例,我有以下表结构,并希望得到总线的动作历史:

ID-----TIME---------BUSID----OPID----MOVING----STOPPED----PARKED----COUNT
1------10:10:10-----101------1101-----1---------0----------0---------15
2------10:10:11-----102------1102-----0---------1----------0---------5
3------10:11:10-----101------1101-----1---------0----------0---------15
4------10:12:10-----101------1101-----0---------1----------0---------15
5------10:13:10-----101------1101-----1---------0----------0---------19
6------10:14:10-----101------1101-----1---------0----------0---------19
7------10:15:10-----101------1101-----0---------1----------0---------19
8------10:16:10-----101------1101-----0---------0----------1---------0
9------10:17:10-----101------1101-----0---------0----------1---------0

我想写一个查询来获取总线的状态,如:

BUSID----OPID----STATUS-----TIME---------DURATION---COUNT
101------1101----MOVING-----10:10:10-----2-----------15
101------1101----STOPPED----10:12:10-----1-----------15
101------1101----MOVING-----10:13:10-----2-----------19
101------1101----STOPPED----10:15:10-----1-----------19
101------1101----PARKED-----10:16:10-----2-----------0

我正在使用SQL Server 2008。

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

您可以使用 Common Table Expressions 来计算不同行之间的持续时间。

WITH cte_log AS
(
    SELECT 
        Row_Number() 
    OVER 
    (
        ORDER BY time DESC
    )
    AS 
        id, time, busid, opid, moving, stopped, parked, count
    FROM
        log_table
    WHERE 
        busid = 101
)
SELECT
    current_rows.busid,
    current_rows.opid,
    current_rows.time,
    DATEDIFF(second, current_rows.time, previous_rows.time) AS duration
    current_rows.count
FROM
    cte_log_position AS current_rows
LEFT OUTER JOIN 
    log_table AS previous_rows ON ((current_rows.row_id + 1) = previous_rows.row_id)
WHERE 
    current_rows.busid = 101
ORDER BY
    current_rows.time DESC;

WITH语句创建在此查询的执行范围内定义的临时结果集。我们使用它来获取每行的先前记录,并计算当前记录和前一记录之间的时间差。

此示例未经过测试,可能无法完美运行,但我希望它能让您朝着正确的方向前进。随意留下反馈。

您可能还想查看以下有关如何使用公用表表达式的外部链接:

答案 1 :(得分:1)

就个人而言,我会对数据进行非规范化,因此您在一行中有start_time和end_time。这将使查询更有效率。

答案 2 :(得分:0)

我目前无法访问SQL Server,因此以下可能存在语法错误:

SELECT
    BUSID,
    OPID,
    IF (MOVING = 1) 'MOVING' ELSE IF (STOPPED = 1) 'STOPPED' ELSE 'PARKED' AS STATUS
    TIME,
    COUNT
FROM BUS_DATA_TABLE
GROUP BY BUSID
ORDER BY TIME

您会注意到这不包括持续时间。在您订购数据之前,您不知道哪个是以前的条目。订购数据后,您可以将持续时间计算为连续记录中的时间差。您可以通过选择新表然后运行第二个查询来完成此操作。

按BUSID分组,应该为您提供所有公交车的报告。

答案 3 :(得分:-1)

对列类型等做出某些假设:

SELECT
   BUSID,
   OPID,
   STATUS,
   TIME,
   DURATION,
   COUNT
FROM
   TABLENAME
WHERE
   BUSID = 1O1
ORDER BY
   TIME
;