【问题标题】:How to Return One DB Row from Two That Have The Same Values In Opposite Columns Using the MAX Function?如何使用 MAX 函数从两个相反列中具有相同值的 DB 行返回一个 DB 行?
【发布时间】:2010-05-31 21:56:28
【问题描述】:

我在一个表中有三列 - ID、Column1、Column2 - 使用此示例数据:

ID  Column1 Column2
----------------------
1   1       2  
2   2       1  
3   4       3  
4   3       4

由于在前两行中,Column1 和 Column2 具有相同的值(但在不同的列中),我希望我的 MAX 查询返回 ID 2。第 3 行和第 4 行也是如此......因为 Columns 1 和 2 具有相同的值(但在不同的列中),我希望 MAX(ID) 返回 4。当然,对于 MAX,您使用 Group By,但这在我的情况下不起作用。

实际上,我需要一个 Group By 来跨两列工作。 这可能吗?如果没有,在给定不同列中的匹配值的情况下,完成获取 2 和 4 的 ID 的最佳方法是什么?

【问题讨论】:

  • 对于什么数据库? MySQL、Oracle 和 Postgres 都支持 GREATEST 函数

标签: sql sql-server tsql


【解决方案1】:

使用 CASE 的替代方法是将列的结果合并,并对它们执行 MAX:

  SELECT z.id,
         MAX(z.col)
    FROM (SELECT x.id,
                 x.column1 AS col
            FROM TABLE x
          UNION 
          SELECT y.id,
                 y.column2
            FROM TABLE y) z
GROUP BY z.id

【讨论】:

  • 注意:在这里折腾一下是使用 UNION 还是 UNION ALL。 UNION ALL 会更快,但不会删除重复项——这意味着要在 MAX 中处理更多内容。
  • 感谢您提供更多信息。由于没有重复,我将使用 UNION ALL。
【解决方案2】:

您可以使用“CASE”

select id, case when column1 > column2 then column1 else column2 end
  from your_table
 where whatever

你的问题不是很清楚,所以这个答案可能不合适。这将为您提供一个“id”值表以及该“id”的“column1”和“column2”中的较大者。

【讨论】:

    【解决方案3】:

    不确定您需要什么 但见下文中的某些内容应该可以工作(您按 col1 和 col2 的较大值分组,然后按 col1 和 col2 的较小值分组

    select max(id) from (
    select 1 as id,  1  as col1,     2  as col2 union all
    select 2 ,  2  ,     1  union all
    select 3  , 4    ,   3  union all
    select 4 ,  3   ,    4) as x
    group by
    case when col1>=col2 then col1 else col2 end,
    case when col1<col2 then col1 else col2 end
    

    【讨论】:

      猜你喜欢
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      相关资源
      最近更新 更多