从“已添加” /“已删除”列中仅查找活动项

蒂姆·麦吉

我正在尝试编写一个查询,以查找最新的项目。该查询来自两个表:

Service_Item - Holds information on items such as Jira tickets / epics / sprints
id
item_type

Service_Item_Links - Many to Many table for service items. This ticket is part of this epic, ect.
link_type
parent_service_item (fk to service_items)
child_service_item (fk to service_items)
action_key ('added' or 'removed')

给定一组parent_service_items,找到相关的子服务项并返回它们的列表。为了仅查找直接子代,我使用查询来简单查找所有关联子代。然后,我在递归的postgres函数中使用此查询,直到没有子项为止。

select child_service_item_id, action_date
from service_item_links
where parent_service_item_id = ANY(source_ids) 
and link_type = ANY(link_types) 
and company_id=cid;

我的目标是更新此文件,以处理最后一个项目被删除的情况。以这种情况为例。

epic 1 
 ticket 1
    links (added, removed)
 ticket 2
    links (added)

epic 2
 ticket 1
    links (added)
 ticket 2
    links (added)

如果给定史诗1作为父ID,则仅应返回票证2。如果将史诗1和史诗2作为父母ID,则应返回票证1和票证2。上面的查询当前为史诗1提供票证1和票证2。

您可以通过jira想象到,这些示例变得更加复杂。关于如何最好地对此进行过滤的任何想法,以便仅在添加了最新操作的情况下才包括故障单。该表包含一个action_key和一个时间戳,该action_key是一个字符串“ added”或“ removed”。

谢谢。

样本数据:

service_items

ID 物品种类
1个 史诗
2 史诗
3
4

service_item_links

link_type parent_service_item child_service_item 动作日期 动作键
“ has_child” 1个 3 '2020-01-01 00:00:00' '添加'
“ has_child” 1个 3 '2020-01-02 00:00:00' “已删除”
“ has_child” 1个 3 '2020-01-03 00:00:00' '添加'
“ has_child” 1个 4 '2020-01-01 00:00:00' '添加
“ has_child” 2 3 '2020-01-01 00:00:00' '添加'
“ has_child” 2 4 '2020-01-01 00:00:00' '添加'

是以上示例的示例数据。

给定父ID为1,应返回子ID为4。

给定父级ID {1,2},则应返回子级3和4。

埃希尔瓦纳

如果删除的行无法再添加,则可以通过以下方法实现:

SELECT DISTINCT
    t.child_service_item, action_date
FROM
    service_item_links t
WHERE
    t.parent_service_item IN (1, 2)
    AND NOT EXISTS
    (
        SELECT
            1
        FROM
            service_item_links t2
        WHERE
            t2.parent_service_item = t.parent_service_item
            AND t2.child_service_item = t.child_service_item
            AND t.action_key = 'removed'
    );

如果以后可以再次添加该行,则需要找出该行的最后一个action_type:

;WITH cte AS (
     SELECT *, FIRST_VALUE(action_key) OVER (PARTITION BY parent_service_item, child_service_item ORDER BY action_date DESC) last_action_type
     FROM service_item_links
)

    SELECT parent_service_item, child_service_item, MAX(action_date) AS action_date
    FROM cte 
    WHERE last_action_type ='added'
    AND parent_service_item IN (1, 2)
    GROUP BY cte.parent_service_item, child_service_item

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

diff仅显示已更改文件中的添加项

来自分类Dev

使用SQL查询查找已删除,已添加和已存在的故障单数量

来自分类Dev

片段已添加:DateDialog

来自分类Dev

IllegalStateException片段已添加

来自分类Dev

如何在Laravel中仅查找已删除的行?

来自分类Dev

Django无法识别已删除/添加的文件

来自分类Dev

添加/删除已编译java代码的代码

来自分类Dev

显示已动态添加的跨度

来自分类Dev

IllegalStateException异常:已添加片段

来自分类Dev

导航链接的路径已添加

来自分类Dev

新添加的网卡已禁用

来自分类Dev

权限被拒绝,但已添加组

来自分类Dev

仅显示已添加到回购中的文件

来自分类Dev

根据已排序的列添加序列列

来自分类Dev

根据已排序的列添加序列列

来自分类Dev

列已删除,现在想重新添加约束

来自分类Dev

Rails迁移列已添加但未填充

来自分类Dev

如何为已解码的列添加条件

来自分类Dev

Rails迁移列已添加但未填充

来自分类Dev

如何在边栏中添加“已删除邮件”?

来自分类Dev

ListAdapter中的TimePickerDialog:已添加片段

来自分类Dev

Android在ActionBarActivity中添加TabListener已停止

来自分类Dev

列表框添加项已删除,但文本框项未删除

来自分类Dev

在JTextPane中查找已删除的文本

来自分类Dev

从合并复制中查找已删除的行

来自分类Dev

在JTextPane中查找已删除的文本

来自分类Dev

从列表中查找已删除的号码

来自分类Dev

更新已添加到表中的列

来自分类Dev

列已添加到表中但未显示