Как вы выбираете верхнюю запись из группы строк из таблицы в базе данных? - PullRequest
0 голосов
/ 19 июня 2009

Я SELECT собираю группу записей, но один столбец дает разные значения в двух или более результатах. Я просто хочу SELECT максимальное значение; не значение Min one или Max, а значение Top N, встречающееся в SQL Server 2008. Существует ли какой-либо механизм агрегирования, который будет выполнять это?

Э.Г.

Таблица содержит:

Microsoft MSFT 12/21/05<br/>Microsoft MSFT 10/22/05<br/>Microsoft MSFT 11/23/06<br/>Paramount PMNT 02/21/05<br/>Paramount PMNT 01/23/06<br/><br/> Я выполняю:

ВЫБЕРИТЕ [Имя], [Символ], Цена Цена
ОТ ААА
ГРУППА ПО [Имя], [Символ]

Желаемый результат:

<i>Microsoft MSFT 12/21/05</i><br/> <i>Paramount PMNT 02/21/05</i><br/>

(TOP не удается)

Ответы [ 5 ]

1 голос
/ 20 июня 2009

Хм, я думаю, что все ответы НЕ отвечают на вопрос (но, конечно, возможно, я неправильно понял вопрос):

Если вы не группируете, вы можете, например, получить MSFT дважды поэтому мы начнем с чего-то вроде этого

select name, symbol, x(date)
from sometable 
group by name, symbol

Вопрос, который я получил, касается функции x (), которая должна возвращать первый элемент столбца даты в соответствующей группе. Проблема в том, что в реляционной базе данных нет естественного порядка строк. Поэтому такая функция не может существовать, поскольку она не определена.

Вам нужен еще один столбец, определяющий порядок, например, метка времени столбца:

select 
    a.name, 
    a.symbol, 
    (
        select b.date 
        from sometable 
        where b.timestamp = min(a.timestamp) 
        and a.name = b.name
        and a.symbol = b.symbol
    ) as first_date
from sometable as a
group by name, symbol

Это по крайней мере работает в оракуле. Если sqlserver не нравится это, можно переписать его как объединение. Альтернативой могут быть аналитические функции, которые, как мне сказали, поддерживаются sqlserver

0 голосов
/ 20 июня 2009

SELECT [Name], [Symbol], PriceDate<br/> FROM aaa<br/> WHERE PriceDate =<br/> (<br/> SELECT Top 1 aaa_2.PriceDate FROM aaa aaa_2<br/> WHERE aaa_2.[Name] = aaa.[Name]<br/> AND aaa_2.[Symbol] = aaa.[Symbol]<br/> )

0 голосов
/ 19 июня 2009

Select TOP не имеет смысла, если вы не указываете порядок (с ORDER BY smt), поэтому вы хотите сделать smt как:

SELECT TOP N *
FROM myTable
ORDER BY anyFields

Возможно, вы получите противоречивые результаты (ничто не гарантирует обратное) без заказа.

0 голосов
/ 19 июня 2009

в одну сторону, вы также можете использовать переменную вместо 1, поскольку sql server 2005

select top (1) * 
from SomeTable
order by SomeColumn
0 голосов
/ 19 июня 2009
SELECT TOP 1   [Name], [Symbol], PriceDate
FROM     aaa
GROUP BY [Name], [Symbol] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...