AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 214310
Accepted
Mark D
Mark D
Asked: 2018-08-08 09:10:06 +0800 CST2018-08-08 09:10:06 +0800 CST 2018-08-08 09:10:06 +0800 CST

未来行不存在的地方

  • 772

我有下表

CREATE TABLE TaskJournal (
  TaskJournalId INT NOT NULL AUTO_INCREMENT,
  TaskId INT NOT NULL,
  TaskStatus TINYINT NOT NULL,
  TaskStart INT NOT NULL,
  TaskEnd INT NULL,
  TaskInfo TEXT,
  PRIMARY KEY (TaskJournalId)
) ENGINE = InnoDB;

INSERT INTO TaskJournal (TaskId, TaskStatus, TaskStart, TaskEnd, TaskInfo) 
VALUES (2, 1, 1533660028, 1533660500, "No issues present"),
(3, 3, 1533660505, 1533660506, "Exception found: Line 95"),
(2, 1, 1533660015, 1533660018, "No issues present"),
(2, 3, 1533660509, 1533660512, "Exception found: Line 95"),
(2, 1, 1533660515, 1533660530, "No issues present");

问题是这样的,我想收集一份错误列表,但前提是将来没有解决办法。

理想情况下我会得到这样的回报

| TaskJournalId | TaskId | TaskStatus | TaskStart  | TaskEnd    | TaskInfo          |
| 3             | 2      | 1          | 1533660015 | 1533660018 | No issues present |

只是因为将来没有一些 TaskId 存在异常。

所以我想我可以通过一组子查询来做到这一点,如下所示:

SELECT * 
FROM TaskJournal 
WHERE TaskId = 2 
GROUP BY TaskId, TaskStatus 
HAVING TaskStatus=3 
ORDER BY TaskStart DESC

但问题在于它返回第 4 行和第 2 行(按时间降序排列)。但在稍后的某个时候,似乎已经解决了 TaskId=2 而不是 TaskId=3。

任何想法都会有所帮助。

mysql-5.5
  • 3 3 个回答
  • 74 Views

3 个回答

  • Voted
  1. Michael Kutz
    2018-08-08T10:13:52+08:002018-08-08T10:13:52+08:00

    MySQL-5.5

    无赖。

    似乎 v5.5 不支持分析函数

    如果是这样,解决方案将类似于:

    select TaskJournalId, TaskId, TaskStatus, TaskStart, TaskEnd, TaskInfo
    from (
      select  TaskJournalId, TaskId, TaskStatus, TaskStart, TaskEnd, TaskInfo
        ,row_number() over (partition by TaskJournalId,TaskId order by TaskStart DESC) rn
      from TaskJournal
    )
    where TaskStatus=3 and rn=1;
    

    我的答案

    升级你的数据库。

    • 1
  2. Kondybas
    2018-08-08T10:21:58+08:002018-08-08T10:21:58+08:00

    看起来您想获取TaskId最后一次出现的每个问题的问题列表,No issues present或者No issues present如果该列表对于某些TaskId. 特殊情况如果没有单个No issues present但有一定的错误TaskId。

    SELECT IFNULL( q.TaskJournalId, x.TaskJournalId ) AS TaskJournalId
           IFNULL( q.TaskId, x.TaskId )               AS TaskId
           IFNULL( q.TaskStatus, x.TaskStatus )       AS TaskStatus
           IFNULL( q.TaskStart, x.TaskStart )         AS TaskStart 
           IFNULL( q.TaskEnd, x.TaskEnd )             AS TaskEnd
           IFNULL( q.TaskInfo, x.TaskInfo )           AS TaskInfo
    
      FROM ( SELECT DISTINCT TaskId 
               FROM TaskJournal 
           ) AS z
    
      LEFT JOIN ( SELECT TaskId, MAX(TaskStart) AS maxTS
                    FROM TaskJournal 
                   WHERE TaskInfo = 'No issues present'
                   GROUP BY TaskId
                ) AS w
             ON w.TaskId = z.TaskId
    
      JOIN TaskJournal  AS x 
             ON x.TaskId = z.TaskId
            AND x.TaskStart = w.maxTS
    
      LEFT JOIN TaskJournal AS q 
             ON q.TaskId = z.TaskId
            AND ( q.TaskStart > w.maxTS OR w.maxTS IS NULL ) 
    ;
    
    • 1
  3. Best Answer
    Mark D
    2018-08-10T06:28:23+08:002018-08-10T06:28:23+08:00

    事实证明这并不像我想象的那么复杂,至少当我退后一步并再次查看问题时是这样。下面是我想出的查询(以及一些小的改进以增强输出)。

      SELECT TaskJournalId, 
             TaskId, 
             TaskStatus, 
             FROM_UNIXTIME(MAX(TaskStart)) AS LastRun, 
             FROM_UNIXTIME(TaskEnd) AS TaskEnd,
             CASE
                 WHEN (LENGTH(MAX(TaskInfo)) = LENGTH('No issues present')) THEN 'OK'
                 ELSE CONCAT('FAIL:', SUBSTR(MAX(TaskInfo), 17, LENGTH(MAX(TaskInfo)))) 
             END AS TaskInfo
        FROM TaskJournal
    GROUP BY TaskId
    ORDER BY TaskId;
    
    • 0

相关问题

  • 为什么其他 MySQL 安装的 my.ini 副本无法在我的 PC 上运行

  • 请检查我的 PC 的 My.INI 设置。附件文件

  • 更改二进制日志和调度的路径

  • Yelp 如何有效地计算数据库中的距离?

  • MySQL 事件不运行

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve