Группировка по Максу - PullRequest
2 голосов
/ 08 февраля 2009
SELECT tblIssue.SYMB, tblIssue.[PRCE], tblIssue.[Shareholder]
FROM tblIssue

Я пытаюсь получить символ и цену для максимального количества акционеров на символ. Например, у меня будет только 1 строка для ASN, где цена будет $ 60,62.

SYMB    Price   Shareholder
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

Ответы [ 6 ]

3 голосов
/ 08 февраля 2009
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;

Это прием, который я использую для решения подобных проблем: покажите мне строку, соответствующую i1, когда нет другой строки i2 с таким же [SYMB] и большим [Shareholder]. То есть если не существует строки с большим [Shareholder], то i1 должно иметь наибольшее значение.

Этот запрос возвращает несколько строк, когда есть привязка для наибольшего значения [Shareholder] на отдельное значение [SYMB], но то же самое верно для большинства других ответов, данных другими людьми в этой теме. Чтобы решить эту проблему, необходимо добавить еще одно условие в объединение, используя уникальный столбец таблицы.

2 голосов
/ 08 февраля 2009

Коррелированный подзапрос кажется самым простым (если я понимаю вашу проблему):

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
1 голос
/ 08 февраля 2009
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

Если это то, что вы ищете.

0 голосов
/ 08 февраля 2009

Это похоже на ответ 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
0 голосов
/ 08 февраля 2009

Это помогло бы;

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
0 голосов
/ 08 февраля 2009

В Oracle:

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