【问题标题】:SELECT Row Values WHERE MAX() is Column Value In GROUP BY QuerySELECT Row Values WHERE MAX() is GROUP BY 查询中的列值
【发布时间】:2013-07-09 12:56:00
【问题描述】:

我怎样才能这样选择?我可以创建一个用户定义的聚合函数吗

SELECT Max(A),(SELECT TOP 1 FROM TheGroup Where B=Max(A)) 来自我的表

其中 MyTable 如下图所示

    A  B  C
--------------
    1  2  S
    3  4  S
    4  5  T
    6  7  T

我想要这样的查询

SELECT MAX(A),(B Where A=Max(A)),C FROM MYTable GROUP BY C

我期待结果如下

 MAX(A)  Condition    C
-----------------------
   3        4         S
   6        7         T

【问题讨论】:

  • 你希望你的结果是什么?
  • 你不能在不指定值的情况下执行SELECT TOP 1
  • @bendataclear 我知道。我只是表达了我的要求
  • 你将不得不用简单的英语描述你想要什么,或者给出一些示例结果,或者这个问题永远不会得到答案......
  • @StevieG 他希望行中的所有列都包含 A 列的最大值

标签: sql sql-server tsql


【解决方案1】:
 SELECT A,B,C FROM
     (SELECT *, ROW_NUMBER() OVER (PARTITION BY C ORDER BY A DESC) RN FROM MyTable)
 WHERE RN = 1

(此查询将始终为每个 C 值返回一行)

WITH CTE_Group AS 
(
    SELECT C, MAX(A) AS MaxA
    FROM MyTable
    GROUP BY C
)
SELECT g.MaxA, t.B, g.C
FROM MyTable t
INNER JOIN CTE_Group g ON t.A = g.MaxA AND t.C = g.C

(如果有多行具有相同的 Max(A) 值 - 此查询将返回所有行)

【讨论】:

    【解决方案2】:

    尝试以下查询:

    SELECT TABLE1.A , TABLE2.B , TABLE1.C
    FROM 
    (
        SELECT MAX(A) AS A,C 
        FROM MYTable 
        GROUP BY C
    ) AS TABLE1 
    INNER JOIN
    (
    SELECT *
    FROM MYTable
    ) AS TABLE2 ON TABLE1.A = TABLE2.A
    

    SQLFIDDLE

    您可以通过简单的连接查询来完成。 join 查询总是比 In query 运行得更快。连接查询在执行查询时只运行一次。我们可以使用 IN query 归档相同的结果。

    【讨论】:

      【解决方案3】:
      SELECT t1.*
      FROM YourTable t1 
      Left Outer Join YourTable t2 on t1.C=t2.C AND t1.A < t2.A
      WHERE t2.A is null
      

      【讨论】:

        【解决方案4】:

        这个怎么样:

            SELECT *
            FROM MyTable    
            WHERE A IN (SELECT MAX(A) FROM MyTable GROUP BY C)
        

        【讨论】:

        • 我认为这行得通。但是查询必须访问表两次。在这个例子中,它是 k,但实际上我通过 INNER JOIN 获得了许多其他表。所以我必须做两次。不需要的代码仪式?
        • 当 A 的值在不同组中重复时,这将给出不正确的结果,例如:[A,B,C]={(1,2,3),(4,5,3 ),(4,2,4),(5,2,4)]
        【解决方案5】:
        SELECT Max(A)
        FROM MyTable
        Where B=(SELECT Max(A) FROM MyTable) 
        

        更新:

        SELECT *
        FROM MyTable
        Where B=(SELECT Max(A) FROM MyTable) 
        

        更新 2:

        SELECT DISTINCT A, B
        FROM MyTable
        Where A=(SELECT Max(A) FROM MyTable GROUP BY C) 
        

        更新 3:

        好的,我想我明白你现在在寻找什么了.. 这个怎么样:

        SELECT *
        FROM MyTable
        Where A in (SELECT Max(A) FROM MyTable GROUP BY C) 
        

        【讨论】:

        • @Luv 不,我想要 Max(A) 以及条件 A=Max(A) 的完整行
        • 与原始要求一样有意义。
        • @StevieG GROUP BY 聚合函数。我怎么能在那里实现它?
        • 只有在 select 子句中有聚合函数时才需要使用 GROUP BY,而我没有。你可能想要 DISTINCT。
        【解决方案6】:
        WITH
          cte AS
        (
          SELECT 
            ROW_NUMBER() OVER (ORDER BY cola desc) AS Rno,
            *
          FROM
            tbl
        )
        SELECT top 1
        cola,colb
        FROM
          cte
        order by Rno
        

        那就试试吧:

            WITH
          cte AS
        (
          SELECT 
            ROW_NUMBER() OVER (PARTITION BY col3 ORDER BY col1 desc) AS Rno,
            *
          FROM
            tbl
        
        )
        SELECT 
        col1,col2,col3
        FROM
          cte
        WHERE Rno=1
        

        【讨论】:

        • @Subin Jacob 试试上面的查询
        • 我想分组。我更新了问题。请检查一下。谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        • 2018-10-26
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多