gpt4 book ai didi

sql - 数据库:选择最后的非空条目

转载 作者:太空狗 更新时间:2023-10-30 01:42:54 24 4
gpt4 key购买 nike

这是一个我绞尽脑汁想过的问题。假设我有一个表,其中包含一系列时间戳和一个部件号作为主键。该表存储增量更改,这意味着对于每个时间戳,如果字段发生更改,则会记录该更改。如果该字段没有改变,那么对于新的时间戳它是 NULL。这是基本思想。

 part | timestamp | x-pos | y-pos | status
------+-----------+-------+-------+--------
a5 | 151 | 5 | 15 | g
a5 | 153 | NULL | 17 | NULL

(part, timestamp) 是主键。第二条记录中的 NULL 表示自第一条记录以来未更改的值。

我希望能够为按部件分组的每个字段选择最新值。例如,给定上述条目,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))

但这会返回单个列,这意味着我可以使用分组依据进行组织。

必须有一种更优雅的做事方式,例如以创造性的方式使用 COALESCE 或 IS NULL。但我被困住了,想不通。有人知道吗?

不,我无法更改数据库结构。

编辑:ruakh 有正确的想法。现在唯一的问题是按部分分组。我似乎无法绕过 LIMIT 1 以按多个部分进行分组。有任何想法吗?

mdahlman,我不太熟悉postgresql 中的解析函数。因此,如果该解决方案比复杂查询更容易,那么一定要发布您的想法。

编辑 2:谢谢大家的帮助。我想我已经足够清楚我需要做什么。

最佳答案

而不是使用 UNION,听起来您真的想要字段列表中的子查询。也就是说,您需要的不是 (SELECT ...) UNION (SELECT ...) UNION (SELECT ...),而是 SELECT (SELECT ...), (SELECT .. .), (SELECT ...).


例如:

SELECT part,
( SELECT x_pos
FROM part_changes
WHERE part = pc.part
AND x_pos IS NOT NULL
ORDER
BY timestamp DESC
LIMIT 1
) AS x_pos,
( SELECT y_pos
FROM part_changes
WHERE part = pc.part
AND y_pos IS NOT NULL
ORDER
BY timestamp DESC
LIMIT 1
) AS y_pos,
( SELECT status
FROM part_changes
WHERE part = pc.part
AND status IS NOT NULL
ORDER
BY timestamp DESC
LIMIT 1
) AS status
FROM ( SELECT DISTINCT
part
FROM part_changes
) AS pc
;

但此时我真的会考虑写一个存储过程。


或者:

SELECT DISTINCT
part,
FIRST_VALUE(x_pos) OVER
( PARTITION BY part
ORDER BY CASE WHEN x_pos IS NULL
THEN NULL
ELSE TIMESTAMP
END DESC NULLS LAST
) AS x_pos,
FIRST_VALUE(y_pos) OVER
( PARTITION BY part
ORDER BY CASE WHEN y_pos IS NULL
THEN NULL
ELSE TIMESTAMP
END DESC NULLS LAST
) AS y_pos,
FIRST_VALUE(status) OVER
( PARTITION BY part
ORDER BY CASE WHEN status IS NULL
THEN NULL
ELSE TIMESTAMP
END DESC NULLS LAST
) AS status
FROM part_changes
;

关于sql - 数据库:选择最后的非空条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8977398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com