连接表上的最大日期问题

时间:2011-03-16 15:08:06

标签: sql postgresql date join grouping

例如,使用日期:2011年3月3日作为今天的日期

表记录:record_id,record_status,record_submitted_date

table record_change_log:change_log_id,record_id,new_record_status,record_change_date,old_record_status

(只有一个record_id) 表记录数据:

1, key, 2011-03-14 08:24:12.04051-04
2, manual, 2011-03-15 09:56:32.04051-04
3, entered, 2011-03-16 07:44:01.04051-04

(将有多个record_id和record_change_date) table record_change_log数据:

100, 3, entered, 2011-03-16 09:54:01.04051-04, ''
101, 3, updated, 2011-03-16 09:55:01.04051-04, entered
102, 2, manual, 2011-03-15 09:56:32.04051-04, ''
103, 3, valid, 2011-03-16 10:00:01.04051-04, updated
104, 2, updated, 2011-03-15 10:01:51.04051-04, manual
105, 3, returned, 2011-03-16 10:11:22.04051-04, valid
106, 1, updated, 2011-03-16 11:11:11.04051-04, key
107, 23, manual, ...
108, 100, test, ...

我需要的是每天使用最后输入的更改日志返回所有record_id。 所以record_id 1会返回:

106, 1, updated, 2011-03-16 11:11:11.04051-04, key

和record_id 2将不会返回,因为日期不是今天:

104, 2, updated, 2011-03-15 10:01:51.04051-04, manual

和record_id 3将返回:

105, 3, returned, 2011-03-16 10:11:22.04051-04, valid

但是在查询中我只需要返回的record_id和new_record_status已经改变了今天的日期,因此在结果中不会返回record_id 2,但是1和3会返回。

现在查询的另一部分是我只需要记录表中的record_id,因此更改日志表中的其他记录也不会被返回:

107, 23, manual, ...
108, 100, test, ...

所以期望的结果是这些是更改日志表中的最后一个条目以及它们是记录表中的记录:

105, 3, returned, 2011-03-16 10:11:22.04051-04, valid
106, 1, updated, 2011-03-16 11:11:11.04051-04, key

我试图加入表格,但似乎无法限制更改日志表中的结果。我可以在更改日志表中限制结果,但无法选择GROUP BY抱怨某些内容所需的所有记录

2 个答案:

答案 0 :(得分:1)

你可以加入一个相关的sub_query,比如......

SELECT
  *
FROM
  record
INNER JOIN
  record_change_log
    ON record_change_log.change_log_id = (
      SELECT
        change_log_id
      FROM
        record_change_log
      WHERE
        record_id = record.record_id
      ORDER BY
        record_change_date DESC
      LIMIT
        1
    )

(我已将“仅限今天”的部分留给您,因为我认为“只需更改日志中的一条记录”就是您需要帮助的部分。)

答案 1 :(得分:0)

--
-- Pull today's most recent change log entries for every known "record_id",
-- if any.
--
SELECT *
  FROM record_change_log
 INNER JOIN (
             -- Find the timestamp of the most recent change log entry
             -- for each known "record_id" (in the "record" table),
             -- which change occurred today.
             SELECT record_id,
                    max(record_change_date) as changed
               FROM record_change_log
              INNER JOIN
                    record USING (record_id)
              WHERE record_change_date::DATE = CURRENT_DATE
              GROUP BY 1
            ) most_recent ON most_recent.record_id = record_change_log.record_id
                             AND
                             record_change_date = most_recent.changed;