2013-11-20 2 views
3

Я пытаюсь извлечь первую строку, которую я получаю после заказа результата на i_version_id. Если я не использую TOP(2), мой запрос работает так, как ожидалось, и возвращает все результаты, отсортированные по i_version_id. Но когда я добавляю TOP(2) (как показано ниже), он говорит, что есть синтаксическая ошибка около distinct. Пожалуйста, дайте мне знать, что я делаю неправильно.SQL Server TOP (1) с отличным

SELECT TOP(2) 
    distinct(i_version_id) 
FROM 
    [PaymentGateway_2006].[dbo].[merchant] 
WHERE 
    dt_updated_datetime > '2013-11-11' 
GROUP BY 
    i_version_id 
ORDER BY 
    i_version_id; 
+1

Какая версия SQL Server? –

+0

Необязательный не требуется, если вы уже группируете тот же столбец, который вы выбираете. –

+1

Пожалуйста, покажите образцы данных и требуемые результаты. Я пытаюсь понять, как вы собираетесь получать разные результаты с четкими и без них, и я думаю, вам нужно будет предоставить дополнительную информацию. –

ответ

9

Если вы только получаете TOP 1 то distinct не имеет значения. Это также не имеет значения, так как группировка по столбцу даст вам различные значения,

Однако, если вы хотите больше, чем один раз удалить скобки:

SELECT DISTINCT TOP(2) 
    i_version_id 
FROM 
    [PaymentGateway_2006].[dbo].[merchant] 
WHERE 
    dt_updated_datetime > '2013-11-11' 
GROUP BY 
    i_version_id 
ORDER BY 
    i_version_id; 
+1

Да, но, скажем, мне нужны 2 отличных результата. –

+0

Можете ли вы предоставить некоторые примеры данных – Juan

0

бы эту работу?

SELECT 
* 
FROM 
(
SELECT i_version_id, 
    ROW_NUMBER() OVER (PARTITION BY i_version_id ASC) [counter] 
FROM 
    [PaymentGateway_2006].[dbo].[merchant] 
WHERE 
    dt_updated_datetime > '2013-11-11' 
GROUP BY 
    i_version_id 
ORDER BY 
    i_version_id 
) a 
WHERE [counter] <= 2 

Это даст счетчик строк для каждой записи. Использование GROUP BY и DISTINCT в вашем примере выше бессмысленно, так как ваша GROUP BY уже ограничивает ваши записи. Включение DISTINCT просто приведет к повышению производительности.

Что касается вашей ошибки, вы не можете использовать TOP и DISTINCT вместе AFAIK. Вы можете попробовать это, если вы хотите тоже:

SELECT 
TOP 2 i_version_id 
FROM 
(
SELECT i_version_id 
FROM 
    [PaymentGateway_2006].[dbo].[merchant] 
WHERE 
    dt_updated_datetime > '2013-11-11' 
GROUP BY 
    i_version_id 
ORDER BY 
    i_version_id 
) a 

(я не проверял это, как я не ваш Db, но я не могу понять, почему это не будет делать то, что вам нужно).