【问题标题】:Group by Max按 Max 分组
【发布时间】:2010-10-06 06:48:57
【问题描述】:
SELECT tblIssue.SYMB, tblIssue.[PRCE], tblIssue.[Shareholder]
FROM tblIssue

我正在尝试为每个 symb 的最大股东数量提取 symb 和价格。例如,我只有 1 行 ASN,价格为 60.62 美元。

SYMB价格股东 ASN $0.00 0 ASN 0.00 美元 51 ASN $25.18 0 ASN $25.26 0 ASN $36.00 0 ASN 60.62 231 美元 ASNL $0.00 101 ASR $0.00 4 ASR $0.00 24 ASR 37.17 美元 13

【问题讨论】:

  • @Quassnoi:我推断 Steve 使用的是 Microsoft SQL Server,因为方括号作为标识符分隔符。

标签: sql sql-server aggregate-functions greatest-n-per-group


【解决方案1】:

在甲骨文中:

SELECT symb, price
FROM (
  SELECT symb, price, ROW_NUMBER() OVER (PARTITION BY symb ORDER BY price DESC) AS rn
  FROM   tblIssue
)
WHERE rn = 1

【讨论】:

    【解决方案2】:
    WITH mx AS (
        SELECT tblIssue.SYMB, MAX(tblIssue.[Shareholder])
        FROM tblIssue
    )
    SELECT tblIssue.SYMB, tblIssue.[PRCE], tblIssue.[Shareholder]
    FROM tblIssue
    INNER JOIN mx
        ON mx.SYMB = tblIssue.SYMB
        AND mx.[Shareholder] = tblIssue.[Shareholder]
    

    这应该产生:

    SYMB    Price   Shareholder
    ASN $60.62  231
    ASNL    $0.00   101
    ASR $0.00   24
    

    如果这就是你要找的。​​p>

    【讨论】:

      【解决方案3】:

      这会有所帮助;

      Select * From tblIssue t2
      Join 
      (
      Select MAX(t1.Shareholder) shrhldr, t1.symb symb
      From tblIssue t1
      Group by t1.symb
      ) tt On tt.shrhldr = t2.Shareholder and tt.symb = t2.symb
      

      【讨论】:

        【解决方案4】:

        相关子查询似乎是最简单的(如果我理解您的问题):

        select symb, price, shareholder
        from issue i
        where price = ( select max(price) from issue where symb = i.symb)
        

        产生:

        ASN 61 231
        ASNL 0 101
        ASR 37 13
        

        【讨论】:

          【解决方案5】:

          这类似于 Quassnoi 的回答,但更正以获取最大股东的行,这是 OP 所要求的。如果您有多行具有相同数量的最大股东的相同符号,它将随机给您其中之一。如果您想要所有这些,请将 ROW_NUMBER 更改为 RANK。

          SELECT symb, price, shareholder
          FROM (
            SELECT symb, price, shareholder, ROW_NUMBER() OVER (PARTITION BY symb ORDER BY shareholder DESC) AS rn
            FROM   tblIssue
          )
          WHERE rn = 1
          

          【讨论】:

            【解决方案6】:
            SELECT i1.*
            FROM tblIssue i1
              LEFT OUTER JOIN tblIssue i2
              ON (i1.[SYMB] = i2.[SYMB] AND i1.[Shareholder] < i2.[Shareholder])
            WHERE i2.[SYMB] IS NULL;
            

            这是我在处理这类问题时使用的技巧:当没有其他行 i2 具有相同的 [SYMB] 和更大的 [Shareholder] 时,显示对应于 i1 的行。 IE。如果不存在具有更大[Shareholder] 的行,则i1 必须具有最大值。

            当每个 [SYMB] 的不同值的最高 [Shareholder] 值相同时,此查询将返回多行,但对于此线程上其他人给出的大多数其他答案也是如此。要解决这个问题,您必须使用表的唯一列向联接添加另一个条件。

            【讨论】:

              猜你喜欢
              • 2016-06-19
              • 2011-10-19
              • 2019-04-15
              • 2014-11-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多