SQL:如何获取最后的项目?

| 我有一个日志,记录了通过我的应用程序的文档。日志如下所示:
TABLE: log
==================================================
| log_id | document_id | status_code | timestamp |
==================================================
| 1      | 10          | 100         | 12345     |
--------------------------------------------------
| 2      | 10          | 200         | 23456     |
--------------------------------------------------
我需要一个在给定的持续时间(例如10分钟;“ 3”是Unix时间戳,btw)中被“卡住”到某个“ 2”中的“ 1”的列表。如果某个特定的“ 1”在某个“ 2”中被“塞住”,则该“ 2”将是该“ 1”的最后一个“ 2”。 我该如何查询?我不确定的两件事: 如何检查文档在一段时间内是否处于某种状态?我想我可以在SQL中使用某种函数/公式(例如
now
-10分钟),但是我不知道该怎么做。 如何仅检查最后一个状态码的持续时间?     
已邀请:
SELECT log.document_id
     , (UNIX_TIMESTAMP() - log.timestamp) / 60
       AS MinutesSinceLastChange 
FROM log
  JOIN
    ( SELECT document_id
           , MAX(timestamp) AS last_change
      FROM log
      GROUP BY document_id
      HAVING (last_change < (UNIX_TIMESTAMP() - 60 * 10))  <-- that is 10 minutes
    ) AS grp
    ON  grp.document_id = log.document_id
    AND grp.last_change = log.timestamp
WHERE log.status_code = \"200\"             <-- code you want to check
    
为了你一无。两个问题,这是我的主张(我想您正在使用MySQL):
SELECT 
    `document_id`, 
    SUBSTR(GROUP_CONCAT(RPAD(`status_code`,5) ORDER BY `timestamp` DESC), 1, 5) AS `last_status`,
    SUBSTR(GROUP_CONCAT(RPAD(`status_code`,5) ORDER BY `timestamp` DESC), 7, 5) AS `prev_status`,

    UNIX_TIMESTAMP(SUBSTR(GROUP_CONCAT(FROM_UNIXTIME(`timestamp`) ORDER BY `timestamp` DESC), 1, 19)) AS `last_timestamp`,
    UNIX_TIMESTAMP(SUBSTR(GROUP_CONCAT(FROM_UNIXTIME(`timestamp`) ORDER BY `timestamp` DESC), 21, 19)) AS `prev_timestamp`
FROM `log`
GROUP BY `document_id`
HAVING `last_timestamp` - `prev_timestamp` > 60*10 AND `last_status` IN (100,200);
好吧,那里藏着什么。我们将按document_id对行进行分组,并在GROUP_CONCAT内对状态代码和时间戳进行排序,以获取最后一个和倒数第二个条目。 如果您的状态码可以包含5位以上的数字,则将其替换为RPAD(
status_code
,X),其中X是status_code长度的最大数目 60 * 10-是10分钟
last_status
IN(100,200)-状态码您只想获取。     
SELECT log.document_id, log.status_code, max(log.timestamp) - min(log.timestamp)
FROM ( 
  SELECT MAX(log_id) as log_id
  FROM log
  GROUP BY document_id) latestLog
    INNER JOIN log latestStatus ON latestStatus.log_id = latestLog.log_id
    INNER JOIN log on latestStatus.status_code = log.status_code
GROUP BY log.document_id, log.status_code
HAVING (max(log.timestamp) - min(log.timestamp)) > 600
    

要回复问题请先登录注册