【发布时间】:2012-02-17 03:25:38
【问题描述】:
这是我一直在思考的一个问题。假设我有一个表,其中包含一系列时间戳和一个零件号作为主键。该表存储增量更改,这意味着对于每个时间戳,如果字段更改,则记录该更改。如果该字段没有改变,那么对于新的时间戳,它是 NULL。 这是基本思想。
part | timestamp | x-pos | y-pos | status
------+-----------+-------+-------+--------
a5 | 151 | 5 | 15 | g
a5 | 153 | NULL | 17 | NULL
(part, timestamp) 是主键。第二条记录中的NULLs 表示自第一条记录以来未更改的值。
我希望能够为按部件分组的每个字段选择最新值。例如,给定上述条目,a5 部分的结果将为 153,5,17,g。
到目前为止,我已经完成了这个组合查询。
((SELECT x-pos FROM part_changes WHERE x-pos IS NOT NULL
ORDER BY timestamp DESC
LIMIT 1)
UNION
(SELECT y-pos FROM part_changesWHERE y-pos IS NOT NULL
ORDER BY timestamp DESC
LIMIT 1)
UNION
(SELECT status FROM part_changes WHERE status IS NOT NULL
ORDER BY timestamp DESC
LIMIT 1))
但这会返回一个单列,这意味着我可以使用 group-by 进行组织。
必须有一种更优雅的做事方式,例如以创造性的方式使用 COALESCE 或 IS NULL。但我被卡住了,无法弄清楚。有人有想法吗?
不,我无法更改数据库结构。
编辑:ruakh 的想法是正确的。现在唯一的问题是按部分分组。我似乎无法绕过LIMIT 1 按多个部分进行分组。有任何想法吗?
mdahlman,我对 postgresql 中的分析函数不太熟悉。因此,如果该解决方案比复杂查询更容易,那么请务必发表您的想法。
编辑 2:谢谢大家的帮助。我想我已经足够了解我需要做什么了。
【问题讨论】:
-
您应该指定是否允许分析函数。有了他们,答案应该很简单。没有他们......这会很艰难。
-
有多少空值可以出现的限制吗?如果有限制,这将是一个带有一些左连接的解决方案.. 不好但可以做到;)
-
我认为没有限制。事实上,其中一个字段的绝大多数(大约 99%)记录为 NULL。
标签: sql database postgresql select null