2010-10-29 2 views
0

У меня есть таблица, как в следующей таблице:Помощь селект MS Sql заявление Выберите

UserID Num1 Num2 Code Name Cat 
7293 32:16.0 50:22.0 3 Jim 33 
7293 32:16.0 59:28.0 4 Jim 12 
7316 32:16.0 55:32.0 4 Karen 33 
7316 32:16.0 28:31.0 4 Karen 7 
7287 32:16.0 01:27.0 2 Mike 33 
7299 32:16.0 18:53.0 4 Sue 16 
7302 32:17.0 54:54.0 4 Bill 28 
7302 32:17.0 01:26.0 4 Bill 10 
7302 32:17.0 01:26.0 3 Bill 32 

и я пытаюсь выбрать уникальные строки. Мне нужен вывод:

UserID Num1 Num2 Code Name Cat 
7293 32:16.0 50:22.0 3 Jim 33 
7316 32:16.0 28:31.0 4 Karen 7 
7287 32:16.0 01:27.0 2 Mike 33 
7299 32:16.0 18:53.0 4 Sue 16 
7302 32:17.0 54:54.0 4 Bill 28 

Я не эксперт по SQL, поэтому любая помощь будет принята с благодарностью.

Я попытался использовать инструкцию SELECT с DISTINCT, но это дает мне только один столбец, мне нужна вся строка. Если я поместил несколько полей в SELECT с DISTINCT, он вернет все строки.

Спасибо за помощь.

Хорошо, чтобы ответить на некоторые из ответов я получил:

1) Я пробовал много запросов, но все они основаны вокруг: SELECT DISTINCT UserID FROM MyTable SELECT DISTINCT * FROM MyTable SELECT DISTINCT UserID, Num1 , Num2, Code, Name, Cat FROM MyTable

Опять же, я не эксперт по SQL и все, что я читал о DISTINCT, нет никакого реального примера того, что нужно.

2) Тем не менее, читая ответы дал мне мысль, так как я на самом деле нужно всего лишь несколько столбцов, такие как UserID, имя,

Могу ли я использовать DISTINCT и указать только те столбцы? Хм, я попробую.

3) Я не уверен, что такое Min, Max в ответах, но я попробую и надеюсь, что в этом процессе лучше понять синтаксис SQL.

Еще раз спасибо за помощь.

+0

Что SQL запросов вы написали так далеко? – joshdick

+0

Из того, что я могу сказать, все ваши ряды являются уникальными. Какие уникальные ценности вы пытаетесь отличить? – dotariel

+0

Данные, которые вы хотите, основываются на минимальном значении num2 для имени, но это не относится к «Билл». –

ответ

4

вам нужно агрегировать поля, которые вы не хотите, чтобы группы на, как:

select UserID, min(Num1), min(Num2), min(Code), min(Name), max(Cat) 
from tbl 
group by userID 
+0

Не работает для Билла, значение кота будет 32, когда OP захочет 28 –

+0

Да, я не был уверен, что его агрегация была последовательной, но я подумал, что я сделаю снимок. вы видите функцию агрегации, которая возвращает его результаты? Если есть, я отредактирую свой ответ. – Beth

+0

Да, это работает, я посмотрел мин-макс, и я понял. Что касается получения 32 против 12 и т. Д., Это не имеет значения для моего случая. Мне просто нужны некоторые поля, и этот запрос, похоже, делает трюк для меня. BTW, моя таблица содержит 16 столбцов, тот, который я вставил, был всего лишь образцом. = – LilMoke

0

Я не знаю, если это лучший способ, но один из способов заключается в использовании группировки:

select UserId, min(Num1), min(Num2), min(Code), min(Name), min(Cat) 
from tbl group by UserId 

Ну, это даст вам Jim 12 вместо Jim 33, но я думаю, вы можете выяснить агрегатная функция, которая дает вам правильную строку.

0

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

2) Правильно ли введен точный вход и точный выход? Мне так же странно, что KarenCat был 7, а не 33 в ответе. У каждого другого пользователя выбрано первое значение.

0

Похоже, что вы хотите получить результат «TOP 1» для каждого UserID.

Для этого на стороне кода было бы проще, чем на стороне SQL, но это возможно.

Одним из таких способов является создание списка отчетливый иденты:

SELECT DISTINCT UserID FROM @YourTable 

Используйте курсор для перебора каждого ID и вставить каждый «TOP 1» запись в временную таблицу:

DECLARE @TempTable TABLE (
    UserID INT, 
    Num1 VARCHAR(10), 
    Num2 VARCHAR(10), 
    Code INT, 
    Name VARCHAR(10), 
    Cat INT 
) 

DECLARE @ID INT 
DECLARE MyCursor CURSOR FOR 
SELECT DISTINCT UserID FROM @YourTable 

OPEN MyCursor 
FETCH NEXT FROM MyCursor INTO @ID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    INSERT INTO @TempTable 
    SELECT TOP 1 * FROM @YourTable WHERE UserID = @ID 

    FETCH NEXT FROM MyCursor 
    INTO @ID 
END 

CLOSE MyCursor 
DEALLOCATE MyCursor 

Теперь ваши требуемые документы должны быть в @TempTable

SELECT * FROM @TempTable 

7287 32:16.0 01:27.0 2 Mike 33 
7293 32:16.0 50:22.0 3 Jim 33 
7299 32:16.0 18:53.0 4 Sue 16 
7302 32:17.0 54:54.0 4 Bill 28 
7316 32:16.0 55:32.0 4 Karen 33 

* Примечание: Мои типов данных отображения, вероятно, не соответствовать вашим.

+0

Это частично неверно (потому что ваш желаемый результат не имеет никакой естественной агрегации.) Эта запись - 7316 32: 16,0 28: 31,0 4 Карен 7 заменена на - 7316 32: 16,0 55: 32,0 4 Karen 33 – TexasViking

0

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

with partTable (rw_num,UserID,Num1,Num2,Code,Name,Category) as 
    (select 
    ROW_NUMBER() over(partition by UserID order by UserID) as rw_num 
    ,UserID 
    ,Num1 
    ,Num2 
    ,Code 
    ,Name 
    ,Category 
    from table_1) 
    select 
    UserID 
    ,Num1 
    ,Num2 
    ,Code 
    ,Name 
    ,Category 
    from partTable where rw_num = 1