0

假设我有一个带有 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        |

我没有更好的解释,抱歉。我尝试的每个子查询都会导致“多于一行”的错误。

我在子查询中尝试了 TIMESTAMPDIFF,我尝试减去两个查询。当然有许多不同的 ID,但结构与发布的完全相同

4

3 回答 3

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

于 2013-06-11T20:24:42.520 回答
1

在您的设计中,您没有足够的数据来进行计算。例如,如果该书a1再次发行,您只需插入另一个事件3,这会造成混乱,例如事件 1、2 和 3 中的哪个是发行事件,哪些是返回事件。

为了解决这个问题,我提出以下建议。

对发出/返回事件对使用相同的事件 ID。添加新指示器以显示它是哪种记录,发出或返回。

例如

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
于 2013-06-11T20:19:19.313 回答
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
于 2013-06-11T20:31:02.013 回答