【发布时间】:2019-07-26 01:08:25
【问题描述】:
我有一个包含四个字段的表:parent_id、field_name、field_value 和 insert_at。
当“日期”字段名称的一行的值介于日期 1 和日期 2 之间时,我需要查找父 id 下的所有最新行。
当前 sql 不返回日期之间的行,它也返回一些较旧的行。我认为如果我可以在 where 子句中放置一个窗口表达式,它会起作用,但现在对于子查询和 CTE,某些东西不会在连接中延续并让不良数据重新进入。
SELECT all_fields.parent_id, all_fields.field_name, all_fields.field_value FROM (
WITH sorted_table AS (
SELECT newest_rows.parent_id from (
SELECT
row_number() over (partition by o3.parent_id, o3.field_name order by o3.inserted_at desc) as row_n,
parent_id
FROM table o3
where field_name = 'date'
and field_value between '2019-01-01' and '2019-01-30'
)
as newest_rows
WHERE newest_rows.row_n = 1
)
SELECT row_number() over (partition by o3.parent_id, o3.field_name order by o3.inserted_at desc) as row_n, o3.parent_id, o3.field_name, o3,field_value
FROM table o3
left join sorted_table so
on so.parent_id = o3.parent_id
) as all_fields
WHERE all_fields.row_n = 1;
给定数据库行:
parent_id field_name field_value inserted_at
1 date jan 25 july 1
1 date feb 2 july 2
1 name frank july 1
1 name nancy july 3
2 date dec 3 july 1
2 date jan 5 july 2
2 name allison july 1
2 name debbie july 2
3 date dec 1 july 1
3 date jan 6 july 2
3 name roger july 1
3 name claire july 3
日期范围:1 月 1 日至 30 日
结果应该是:
parent_id field_name field_value inserted_at
2 date jan 5 july 2
2 name debbie july 2
3 date jan 6 july 2
3 name claire july 3
日期字段是最新的并且在范围内,因此它返回 parent_id 下每个 field_name 的所有最新行。
【问题讨论】:
-
为什么艾莉森没有归还?
-
因为它比黛比老。我需要每个字段名称的最新行。我会在我的问题中澄清这一点。
标签: sql postgresql