假设我有一个带有ID,时间戳和事件的表。
例如:我有一张ID为1的书,另一张ID为2的书。两张都是在特定时间戳上借出的,在表格中由事件1标记。
然后两个都与事件2一起返回。那么我怎样才能找出每本书的借阅期?我找不到答案,我变得疯狂了!
表
ID | Timestamp | Event
-------------------------------
a1 | 2013-10-23 | 1
a2 | 2013-10-23 | 1
a1 | 2013-10-25 | 2
a2 | 2013-10-26 | 2
结果
ID | Days lent |
-----------------------
a1 | 2 |
a2 | 3 |
我没有更好的解释,抱歉。我试过的每个子查询都会导致“多行”错误。
我在subquerys中尝试了TIMESTAMPDIFF,我试图减去两个查询。当然有许多不同的ID,但结构与发布完全相同
答案 0 :(得分:1)
在您的设计中,您没有足够的数据来进行计算。例如。如果再次发布了本书a1
,您只需插入另一个事件3
,这会产生混淆,例如事件1,2和3中的哪一个是问题事件,哪些是返回事件。< / p>
为了解决这个问题,我提出以下建议。
对发布/返回事件对使用相同的事件ID。 添加新指标以显示哪种记录,发布或返回。
E.g。
ID | Timestamp | Event | Type
---------------------------------------
a1 | 2013-10-23 | 1 | Issue
a2 | 2013-10-23 | 1 | Issue
a1 | 2013-10-25 | 1 | Return
a1 | 2013-10-26 | 1 | Return
所以在这种情况下,查询将是
Select Book.ID, (Return_T.return_date - Issue_T.issue_date) duration
from
(Select ID, Timestamp issue_date from Book where Type='Issue') Issue_T,
(Select ID, Timestamp return_date from Book where Type='Return') Return_T,
Book
where Book.ID = Issue_T.ID
and Issue_T.ID = Return_T.ID
答案 1 :(得分:1)
SELECT
s.id,
DATEDIFF(e.timestamp, s.timestamp) AS Days_lent
FROM
schedule AS s -- start
JOIN
schedule AS e -- end
ON s.id = e.id
AND s.timestamp < e.timestamp
WHERE
s.event = 1
AND
e.event = 2 ;
测试: SQL-Fiddle
答案 2 :(得分:0)
你可以使用这样的查询:
SELECT
id,
DATEDIFF(
MAX(CASE WHEN Event=2 THEN Timestamp END),
MIN(CASE WHEN Event=1 THEN Timestamp END)) AS days_lent
FROM
schedule
GROUP BY
id