Помогите с выбором MS Sql Select - PullRequest
0 голосов
/ 29 октября 2010

У меня есть таблица, подобная следующей:

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) Я пробовал много запросов, но все они основаны на: ВЫБЕРИТЕ РАЗЛИЧНЫЙ ИДЕНТИФИКАТОР ИЗ MyTable ВЫБЕРИТЕ DISTINCT * ОТ MyTable ВЫБЕРИТЕ DISTINCT ИД пользователя, Num1, Num2, код, имя, Cat FROM MyTable

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

2) Однако чтение ответов заставило меня задуматься, поскольку мне действительно нужно всего несколько столбцов, таких как UserID, Name,

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

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

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

Ответы [ 5 ]

4 голосов
/ 29 октября 2010

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

select UserID,  min(Num1),  min(Num2), min(Code), min(Name), max(Cat)
from tbl
group by userID
0 голосов
/ 29 октября 2010

В этом запросе не делается никаких предположений относительно того, что является строкой от каждого пользователя, которого вы хотите. Чтобы ранжировать запрос, чтобы принять «определенное» верхнее значение, вам придется изменить порядок по выражению в выражении «OVER» для функции «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
0 голосов
/ 29 октября 2010

Может показаться, что вы хотите получить результат "TOP 1" для каждого идентификатора пользователя.

Сделать это на стороне кода проще, чем на стороне SQL, но это возможно.

Oneтакой способ состоит в том, чтобы сгенерировать список различных идентификаторов пользователей:

SELECT DISTINCT UserID FROM @YourTable

Используйте курсор для итерации по каждому идентификатору и вставьте каждую запись «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 голосов
/ 29 октября 2010

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

2) Точный ли ввод и точный вывод верны? Мне кажется странным, что Karen s Cat было 7, а не 33 в «ответе». Каждому другому пользователю выбрано первое значение.

0 голосов
/ 29 октября 2010

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

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

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

...