2014-01-24 5 views
0

Я не MSSQL pro, на самом деле это разочаровывает меня «Microsoft Way» от некоторых вещей, но эй, достаточно напыщенной речи. Мне нужно запустить очень простой запрос, в Mysql это очень просто, но в MSSQL я не могу добиться того, чего хочу.Отличные результаты MSSQL Group By?

У меня есть 1 таблица, таблица содержит имена пользователей и пароли и код года, однако некоторые счета дублируются, и мне нужно, чтобы быть в состоянии вытащить последний результат для всех студентов

Таблица

username__________password____________yearcode 
112211------------dgsvdhsa------------11/12 
112211------------dsgvrrhb------------12/13 
234543------------36%Sldof------------11/12 
344321------------sDDdesSs------------11/12 
234543------------plOKjwDS------------12/13 

Желаемая Выход

username__________password____________yearcode 
112211------------dsgvrrhb------------12/13 
344321------------sDDdesSs------------11/12 
234543------------plOKjwDS------------12/13 

Любая помощь ш с этим было бы очень благодарно, я попробовал группировать по имени пользователя, и я получаю агрегатные ошибки функции. Я попробовал Distinct, и я не получил желаемых результатов.

Спасибо за вашу помощь, ниже окончательное решение:

SELECT * 
FROM 
(
    SELECT t.*, 
    ROW_NUMBER() OVER (PARTITION BY PERSON_CODE ORDER BY SessionCode DESC) rnum 
    FROM table.dbo.Students t 
    WHERE t.FORENAME LIKE '%$user%' OR t.SURNAME LIKE '%$user%' OR t.PERSON_CODE LIKE '%$user%' 
) q 

ГДЕ rnum = 1

+1

Post запросы, которые вы пробовали. Это поможет людям помочь вам. –

ответ

1

Вы можете сделать это таким образом

SELECT username, password, yearcode 
    FROM 
(
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY username ORDER BY yearcode DESC) rnum 
    FROM table1 t 
) q 
WHERE rnum = 1 
ORDER BY username; 

или старой школы путь без оконных функций

SELECT t.username, t.password, t.yearcode 
    FROM 
(
    SELECT username, MAX(yearcode) yearcode 
    FROM table1 
    GROUP BY username 
) q JOIN table1 t 
    ON q.username = t.username 
    AND q.yearcode = t.yearcode 
ORDER BY username; 

Выход:

 
| USERNAME | PASSWORD | YEARCODE | 
|----------|----------|----------| 
| 112211 | dsgvrrhb | 12/13 | 
| 234543 | plOKjwDS | 12/13 | 
| 344321 | sDDdesSs | 11/12 | 

Вот SQLFiddle демо

+0

Это прекрасно, я отредактирую свое сообщение, чтобы показать полный запрос с моими предложениями. Но твой великий. Я не понимаю, почему вы хотите выбрать и выбрать еще раз. Не могли бы вы объяснить это? - Будучи разработчиком PHP, я так использовал для выполнения всего моего набора данных, обрабатывающего PHP, а не на стороне сервера. –

+1

Во внутреннем выборе мы получаем номер строки для каждого имени пользователя, упорядоченного по убыванию по коду года. Этот способ получит номер строки = 1 для всех последних записей для каждого пользователя. Затем во внешнем элементе мы отфильтровываем все записи, которые не равны 1, фактически оставляя только последние записи. Аналитические оконные функции очень быстрые и мощные. – peterm

+0

Спасибо, что имеет больше смысла для меня сейчас! –

-1

Используйте этот запрос, он будет работать для вашего состояния,

SELECT DISTINCT(username),password,yearcode 
FROM Table1 t; 
+0

Вы попробовали? – peterm

+0

Он вернет все строки. –

+0

Я уверен, что я пробовал это раньше, и он не возвращает желаемые результаты. Но Петрму удалось дать решение спасибо, хотя Шивам. –

0

Похоже, что вы хотите, чтобы записи для последней yearcode ,

В простой SQL я хотел бы сделать что-то вроде этого:

select * from table t1 where yearcode = 
    (select max(yearcode) from table t2 where t1.username = t2.username); 
Смежные вопросы