postgres选择每个实体的最新记录,但字段值

时间:2016-06-30 16:24:10

标签: postgresql

我有一个看起来像这样的日志表:

---------------------------------------------
| id | company | type  | date_created |notes|
---------------------------------------------
| 1  |   co1   |       |  2016-06-30  | ... |
| 2  |   co2   | ERROR |  2016-06-30  | ... |
| 3  |   co1   |       |  2016-06-29  | ... |
| 4  |   co2   |       |  2016-06-29  | ... |

我有以下内容选择每个实体的最新记录:

SELECT * 
FROM import_data_log a 
JOIN (SELECT company, max(date_created) date_created
        FROM import_data_log
      GROUP BY company) b
ON a.company = b.company AND a.date_created = b.date_created

给出了结果:

| 1  |   co1   |       |  2016-06-30  | ... |
| 2  |   co2   | ERROR |  2016-06-30  | ... |

我需要添加一个条件,该条件不会选择 type = ERROR 的条目,并获得该公司的下一个最高日期,因此它会给出:

| 1  |   co1   |       |  2016-06-30  | ... |
| 4  |   co2   |       |  2016-06-29  | ... |

有什么想法吗?这可能是一件简单的事情,但对于我的生活,我似乎无法让它发挥作用。

UPDATE / FIX: 好吧经过大量的头发拉动后,对于遇到此问题的任何人来说,显然Postgres没有将null字段与任何东西进行比较,因此它完全忽略了type = null的所有行。

我修复它的方法就是这样,可能有一个更好的解决方案,但现在这个有效:

SELECT * 
FROM import_data_log a 
JOIN (SELECT company, max(date_created) date_created
        FROM import_data_log
        WHERE (type <> 'ERROR' OR type is null)
      GROUP BY company) b
ON a.company = b.company AND a.date_created = b.date_created

2 个答案:

答案 0 :(得分:0)

使用以下查询

SELECT id,company,type,max(date_created),notes 
FROM import_data_log
WHERE type != 'ERROR'
GROUP BY company

答案 1 :(得分:0)

select distinct on (company) *
from import_data_log
where type is distinct from 'ERROR'
order by company, date_created desc

检查distinct onis [not] distinct from

  

当任一输入为空时,普通比较运算符产生null(表示“未知”),而不是true或false。例如,7 = NULL产生null,7&lt;&gt;空值。如果此行为不合适,请使用IS [NOT] DISTINCT FROM构造