我有一个场景,不太确定如何查询它。作为一个示例,我有以下表结构,并希望得到总线的动作历史:
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。
感谢您的帮助。
答案 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
;