去重并在重复中获取最新信息的那一列

序:

我后面那哥们要我给他在一张表中回写update记录,就是不同的人提交了只选取最新的节点信息,往那张表中插入最新的就可以了。我给他增加了这个功能,现在他又给了我一个新到的需求。

需求

找到存放节点信息的表,导出最新的节点名称和节点的id给他。

详细需求一步一步分析

先看创建表的sql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE [dbo].[lbpm_audit_note](
[fd_id] [varchar](36) NOT NULL,
[fd_fact_node_id] [varchar](50) NULL,
[fd_fact_node_name] [varchar](200) NULL,
[fd_action_key] [varchar](50) NULL,
[fd_action_name] [varchar](200) NULL,
[fd_action_info] [varchar](4000) NULL,
[fd_audit_note] [varchar](4000) NULL,
[fd_audit_note_from] [varchar](50) NULL,
[fd_create_time] [datetime] NULL,
[fd_node_id] [varchar](36) NULL,
[fd_workitem_id] [varchar](36) NULL,
[fd_notify_type] [varchar](50) NULL,
[fd_execution_id] [varchar](36) NULL,
[fd_parent_execution_id] [varchar](36) NULL,
[fd_process_id] [varchar](36) NOT NULL,
[fd_handler_id] [varchar](36) NULL,
[fd_byaccr_id] [varchar](255) NULL,
[fd_expecter_id] [varchar](36) NULL,
[fd_accr_id] [varchar](255) NULL,
[fd_accr_type] [varchar](10) NULL,
[fd_commissioner_id] [varchar](255) NULL,
[fd_private_group] [varchar](100) NULL
) ON [PRIMARY]

写sql之前

一开始,我是根据系统打断点,找到发sql的地方,找到关键性的sql,但是由于是hql语句,所以我又得去找表与实体类之间的映射关系,找到hibernate的配置文件之后,找到表,直接去sql server管理器中select * from 那张表 ,理清思路之后,明白了我要做的事.

真实的sql需求是

  1. 因为一个流程中 fd_process_id 是一样的,也就是说着一列是重复的,当然也可以是不重复的
  2. 让我找到最新的节点名称,这个好办,因为审批流程是按时间顺序来的,根据那个hql语句也能看出来。
  3. 但是问题就是在这里 ,我要找到所以得最新的

    我的分析过程

    1
    2
    3
    4
    select  top 1 fd_id , fd_fact_node_name from
    lbpm_audit_note where fd_process_id = '158a91b47100e1c93ffb89140c583fd2' and
    fd_action_key is not null
    order by fd_create_time desc ;

等我一步一步开始搜索全部的时候问题就来了

1
2
3
4
5
select  fd_id , fd_fact_node_name  from
lbpm_audit_note where fd_process_id
in (select fd_process_id from lbpm_audit_note group by fd_process_id having count(fd_process_id) > 1 )
and fd_action_key is not null
order by fd_create_time desc ;

这个是我当时分析的,但是很明显这个结果不对,id一一对应但是没有只获取最新的节点

1
2
3
4
5
select  A.fd_id , A.fd_fact_node_name  from
lbpm_audit_note as A ,
(select fd_process_id ,MAX(fd_create_time) as fd from lbpm_audit_note group by fd_process_id
having count(fd_process_id) > 1)
as B where A.fd_process_id = B.fd_process_id and A.fd_action_key is not null and A.fd_create_time = B.fd

上面这个是思考半天,参考了https://blog.csdn.net/tongyiyi/article/details/5787755之后得到的答案,记录一哈.

0%