【问题标题】:Looking for a way to filter the result of these UNION queries in SQL寻找一种在 SQL 中过滤这些 UNION 查询结果的方法
【发布时间】:2020-04-10 04:35:55
【问题描述】:

我想过滤由 UNION 连接的这 2 个查询的结果。我想添加一条 SELECT 语句来过滤日期、ID 和名称方面的最新信息。问题是这两个查询在使用 UNION 后会产生重复,我必须避免这种情况。只需要一个最新的日期、姓名和 ID。

(select  authorize_id,
purchase_authorizer_api.Get_Name(authorize_id) as "Authorizer Name",  
max(date_approved) as "Last Date Approved", 'PR' as "Approval Type"
from PURCH_REQ_LINE_APPROVAL
group by authorize_id )

union 

( select  authorize_id,
purchase_authorizer_api.get_name(authorize_id) as "Authorizer Name",
 max(date_approved) as "Last Date Approved", 'PO' as "Approval Type"
from PURCHASE_ORDER_APPROVAL
group by authorize_id ) 

以下是来自 2 个查询的一些示例数据:

AUTHORIZE_ID    Authorizer Name     Last Date Approved  Approval Type
AANDR           Alfredo And         2012-10-16 12:51           PR
AANDR           Alfredo And         2016-09-06 13:08           PO
AESFAH          Arash Esf           2017-05-26 13:28           PO
AHAMM           Ahmed Hamd          2019-12-04 14:15           PO
AJAHAN          Al Jaha             2012-11-02 9:56            PR
AJAHAN          Al Jaha             2013-10-29 14:17           PO

我只想从中获取最新日期,这样可以避免重复。
任何帮助将不胜感激。 谢谢。

【问题讨论】:

  • 提供样本数据和期望的结果。
  • 严格来说UNION的结果不能包含重复。您需要UNION ALL 以防止它过滤掉重复的结果。大概您对“重复”的定义仅包括某些列
  • UNION 不会产生重复,UNION ALL 会。查看输出数据。我敢打赌这两行并不真正匹配。但我不认为这是问题所在。你到底想做什么?
  • UNION 不会重复。两个选择之间的字段批准类型不同,因此无法生成由 UNION 引起的重复。你能提供一个数据的例子吗?
  • 感谢您的及时回复。

标签: sql filter union


【解决方案1】:

在 2 个表的 UNION 上使用 ROW_NUMBER() 窗口函数为每个 authorize_id 返回 1 行:

with cte as (
  select authorize_id, date_approved, 'PR' as "Approval Type" from PURCH_REQ_LINE_APPROVAL  
  union all
  select authorize_id, date_approved, 'PO' as "Approval Type" from PURCHASE_ORDER_APPROVAL 
)
select 
  t.authorize_id, 
  purchase_authorizer_api.Get_Name(t.authorize_id) as "Authorizer Name", 
  t.date_approved as "Last Date Approved", 
  t."Approval Type" 
from (
  select c.*, row_number() over (partition by c.authorize_id order by c.date_approved desc) rn
  from cte c
) t
where t.rn = 1

查看简化的demo(没有Authorizer Name)。
结果:

| authorize_id | Authorizer Name | Last Date Approved       | Approval Type |
| ------------ | --------------- | ------------------------ | ------------- |
| AANDR        |                 | 2016-09-06T13:08:00.000Z | PO            |
| AESFAH       |                 | 2017-05-26T13:28:00.000Z | PO            |
| AHAMM        |                 | 2019-12-04T14:15:00.000Z | PO            |
| AJAHAN       |                 | 2013-10-29T14:17:00.000Z | PO            |

【讨论】:

  • 感谢您的帮助。不幸的是,它在第​​ 12 行 ('' select *, row_number....) 上给了我一个错误,说 FROM 关键字未在预期的地方找到。我正在使用 PL/SQL。
  • 那个有效。我注意到了问题所在。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 2019-07-04
  • 2018-07-30
  • 2023-01-19
  • 2019-01-08
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多