从具有联合的两个表中选择一列中最大值的所有行

Posted

技术标签:

【中文标题】从具有联合的两个表中选择一列中最大值的所有行【英文标题】:Select all rows where maximum value on a one column from two tables with union 【发布时间】:2021-01-06 15:05:37 【问题描述】:

我得到了两个结构相同的表。从这些表中,我需要在 fix_id 相同的速率列上获取具有最高值的行。

表1

fix_id | rate  |  proc  | unique_id
 2     |  72   |   50   | 23_tab1
 3     |  98   |   70   | 24_tab1
 4     |  78   |   80   | 25_tab1

表2

fix_id | rate  |  proc  | unique_id
 2     |  75   |   999  | 23_tab2
 3     |  80   |   179  | 24_tab2
 4     |  82   |   898  | 25_tab2

预期结果

fix_id | rate  |  proc  | unique_id
 2     |  75   |   999  | 23_tab2
 3     |  98   |   70   | 24_tab1
 4     |  82   |   898  | 25_tab2

我试过这个...

Select fix_id,proc,unique_id,MAX(rate) rate from 
(Select fix_id,proc,unique_id,MAX(rate) rate from table1 group by fix_id
UNION ALL SELECT fix_id,proc,unique_id,MAX(rate) rate from table2 group by fix_id ) group by fix_id

我从 rate 列得到最高值,但其他列的值不正确。

【问题讨论】:

我猜你正在使用 mysql?如果选择列时没有按它们分组或对其应用聚合函数,则您将不会决定选择其中的哪一个。 两个表是否可以多次使用相同的fix_id 不,fix_id 在每个表中都是唯一的 【参考方案1】:

可以使用 CASE 语句来完成。 试试这个查询

select 
(case 
   when T1.rate > T2.rate then T1.fix_id else T2.fix_id 
end) as fix_id, 

(case 
   when T1.rate > T2.rate then T1.rate else T2.rate
end) as rate, 

(case 
   when T1.rate > T2.rate then T1.proc else T2.proc 
end) as proc,

(case 
   when T1.rate > T2.rate then T1.unique_id else T2.unique_id 
end) as unique_id

from table1 as T1, table2 as T2 where T1.id = T2.id

【讨论】:

【参考方案2】:

你可以使用row_number():

select t.*
from (select fix_id, proc, unique_id, rate,
             row_number() over (partition by fix_id order by rate desc) as seqnum
      from ((select fix_id, proc, unique_id, rate from table1
            ) union all
            (select fix_id, proc, unique_id, rate from table2
            ) 
           ) t
     ) t
where seqnum = 1;

【讨论】:

***.com/questions/8387587/… 那么你需要这样的东西。 我已经尝试过了,但我得到了错误....for the right syntax to use near '(partition by fix_id order by rate desc) as seqnum........ @user2741313 。 . . MySQL 自几年前发布版本 8 以来就支持窗口函数。 我明白了,无论如何要编写查询以在以前的版本上工作,我在共享服务器上,我无法升级【参考方案3】:

由于fix_id 在两个表中都是唯一的,CASE 语句 (https://***.com/a/65609931/53341) 的答案可能是最快的(所以,我赞成)... p>

加入一次 比较每行的费率 在每一行中选择要读取的表

但是,对于大量列,键入所有 CASE 语句很不方便。所以,这里有一个较短的版本,虽然它可能需要两倍的时间来运行......

SELECT t1.*
  FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.fix_id = t2.fix_id
 WHERE t1.rate >= t2.rate

UNION ALL

SELECT t2.*
  FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.fix_id = t2.fix_id
 WHERE t1.rate <  t2.rate

【讨论】:

以上是关于从具有联合的两个表中选择一列中最大值的所有行的主要内容,如果未能解决你的问题,请参考以下文章

从具有两个变量列的表中选择最大值(microsoft SQL)

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值

如何编写sql查询以选择一列中具有最大值的行

基于sql中另一列的一列中的最大数据

SQL根据一列中的最大值从多列中选择不同的行

SQL选择表中具有最大值的行,按另一列排序