AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 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

Onde as linhas futuras não existem

  • 772

tenho a seguinte tabela

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");

O problema é este, quero reunir uma lista de erros mas apenas se no futuro não houver resolução.

Idealmente, eu receberia algo assim de volta

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

Só porque no futuro não há algum TaskId que tenha a exceção presente.

Então eu pensei que poderia fazer isso por meio de um grupo de subconsultas algo como o seguinte:

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

Mas o problema com isso é que ele retorna as duas linhas 4 e 2 (ordem cronológica decrescente). Mas em algum momento posterior parece ter havido uma resolução para TaskId=2, mas não para TaskId=3.

Qualquer idéia será útil.

mysql-5.5
  • 3 3 respostas
  • 74 Views

3 respostas

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

    MySQL-5.5

    Desapontamento.

    Parece que as funções analíticas não são suportadas na v5.5

    Se isso acontecesse, a solução seria algo como:

    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;
    

    Minha resposta

    Atualize seu banco de dados.

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

    Parece que você deseja obter a lista de problemas para cada um TaskIdque segue a última ocorrência do No issues presentou exatamente a string No issues presentse essa lista estiver vazia com certeza TaskId. O caso especial se não houver um único No issues present, mas houver alguns erros com certeza 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

    Acontece que isso não era tão complicado quanto eu pensava, pelo menos quando dei um passo para trás e olhei para o problema novamente. Abaixo está a consulta que criei (e alguns pequenos floreios para aprimorar a saída).

      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

relate perguntas

  • Por que uma cópia do my.ini de outra instalação do MySQL não está funcionando no meu PC

  • Revise as configurações do My.INI do meu PC. Arquivo anexado

  • Alterar caminho para logs binários e agendamento

  • Como o Yelp calcula com eficiência a distância no banco de dados?

  • Evento MySQL não é executado

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve