例如,使用日期: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抱怨某些内容所需的所有记录
答案 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;