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

Postgresql postgres选择每个实体的最新记录,字段值除外,postgresql,Postgresql,我有一个类似以下内容的日志表: --------------------------------------------- | id | company | type | date_created |notes| --------------------------------------------- | 1 | co1 | | 2016-06-30 | ... | | 2 | co2 | ERROR | 2016-06-30 | ... | | 3

我有一个类似以下内容的日志表:

---------------------------------------------
| 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  | ... |
有什么想法吗?这可能很简单,但就我的一生而言,我似乎无法让它发挥作用

更新/修复: 好的,在做了大量的分析之后,对于任何遇到这个问题的人来说,显然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
使用下面的查询

SELECT id,company,type,max(date_created),notes 
FROM import_data_log
WHERE type != 'ERROR'
GROUP BY company
使用下面的查询

SELECT id,company,type,max(date_created),notes 
FROM import_data_log
WHERE type != 'ERROR'
GROUP BY company
检查并确认:

当任一输入为null时,普通比较运算符产生null表示未知,而不是true或false。例如,7=NULL产生NULL,正如7 NULL产生NULL一样。如果此行为不合适,请使用与构造[不]不同的

检查并确认:

当任一输入为null时,普通比较运算符产生null表示未知,而不是true或false。例如,7=NULL产生NULL,正如7 NULL产生NULL一样。如果此行为不合适,请使用与构造[不]不同的


我已更改了对您的需求的查询:我已更改了对您的需求的查询:出于某种原因,这将导致零结果。现在,我得到:错误:列import\u data\u log.id必须出现在GROUP BY子句中,或用于聚合函数行1:选择id、公司、类型、maxdate\u created,注意:这是由于数据库引擎中的sql模式造成的,请使用set sql\u mode=将其设置为none,然后点击查询@Mankind1023。由于某些原因,这将导致零结果。现在我得到:错误:列import\u data\u log.id必须出现在GROUP BY子句中或用于聚合函数行1:选择id、公司、类型,maxdate_创建,notesit是由于数据库引擎中的sql_模式,使用set sql_mode=将其设置为none,然后点击查询@Mankind1023I最初从本文获得的代码,因此他们有不同的选项,但有人提到,在较大的表上这比在distinct上快得多。出于某种原因,这也会导致零结果。如果我删除,它将给出2个标准结果。我已经确认表中有类型为空/非错误的字段。@Mankind1023我将比较运算符更改为“以防类型为空”,因此这也不起作用,但它确实让我想到了在代码中使用类型为“错误”或类型为空的字段,这很有效。我最初从这里的一篇文章中获得了代码,因此它们有不同的选项,但有人提到,在较大的表上,这比在distinct上快得多。出于某种原因,这也会导致零结果。如果我删除,它将给出2个标准结果。我已经确认表中有类型为空/非错误的字段。@Mankind1023我将比较运算符更改为“以防类型为空”,因此这也不起作用,但它确实让我想到了在代码中使用类型为“错误”或类型为空的字段,这很有效。