2
SELECT tblIssue.SYMB, tblIssue.[PRCE], tblIssue.[Shareholder] 
FROM tblIssue 

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

 
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 
+0

Какие СУБД вы используете? – Quassnoi

+0

@Quassnoi: Я полагаю, что Стив использует Microsoft SQL Server из-за квадратных скобок как разделителей идентификаторов. –

ответ

0

В 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 
1
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

Это поможет;

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 
2

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

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 
0

Это похоже на ответ Quassnoi, но исправлен, чтобы получить строку с максимальным Акционером, что и требовал ОП. Если у вас несколько строк для одного и того же символа с одинаковым количеством максимальных акционеров, это даст вам один из них наугад. Если вы хотите их всех, измените 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 
3
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], но то же самое верно для большинства других ответов, данных другими людьми в этой теме. Чтобы решить эту проблему, вам нужно добавить еще одно условие для соединения, используя уникальный столбец таблицы.