【问题标题】:Is there a T-SQL shortcut for getting the max values of two columns是否有用于获取两列最大值的 T-SQL 快捷方式
【发布时间】:2014-01-16 20:57:19
【问题描述】:

我的意思是,假设你有一张这样的桌子:

Col1 Col2
---- ----
 1    1
 1    9
 2    1
 2    3
 4    1
 4    2

我想得到:Col1=4 和 Col2=2,因为 Col1 优先。换句话说,我想要 Col1 的最大值,并且对于该值,Col2 在最小 T-SQL 表达式中的最大值。这几乎就像在说:

SELECT TOP 1 Col1, Col2
FROM MyTable
ORDER BY Col1, Col2 DESC

但是这样做的方式是 Col1、Col2 值可以在另一个查询中使用。

【问题讨论】:

  • 当您说“Col1、Col2 值在另一个查询中可用的这种方式”时,我对您的意思感到困惑。根据您在此之前所说的内容,如果您还对 Col1 进行降序排序,则您提供的查询将起作用。

标签: sql-server sql-server-2008 tsql sql-server-2008-r2


【解决方案1】:

真的不像MAX(Col1, Col2)。如果你想模拟MAX ... GROUP BY X,你可以使用

WITH T AS
(
SELECT Col1,
       Col2,
       ROW_NUMBER () OVER (PARTITION BY X ORDER BY Col1 DESC, Col2 DESC) AS RN
FROM MyTable
)
SELECT Col1,
       Col2,
          X
FROM T
WHERE RN= 1;

【讨论】:

  • 带有 ORDER BY 的分区,不错!
【解决方案2】:

像这样?一行

SELECT ...
FROM
   SOmeTable
   JOIN
   (
    SELECT TOP 1 Col1, Col2
    FROM MyTable
    ORDER BY Col1, Col2 DESC
    ) foo ON S.Col1 = foo.Col1

还是按外排?

SELECT ...
FROM
   SOmeTable S
   CROSS APPLY
   (
    SELECT TOP 1 Col2
    FROM MyTable M
    WHERE S.somecol = M.SomeCol
    ORDER BY Col2 DESC
    ) foo

SELECT ...
FROM
   SOmeTable S
   CROSS APPLY
   (
    SELECT Col1, MAX(Col2) AS MaxCOl2
    FROM MyTable M
    GROUP BY Col1
    ) foo ON S.Col1 = foo.Col1

【讨论】:

    【解决方案3】:
    WITH t(Col1,maxCol1,maxCol2) AS (
      SELECT
        Col1,
        MAX(Col1) OVER(),
        MAX(Col2) OVER(PARTITION BY Col1)
    )
    SELECT TOP 1 maxCo11,maxCol2 FROM t WHERE Col1 = maxCol1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-23
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多