[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ORDER BY и Group BY
zvezda_t
Здравствуйте, уважаемые программисты!

Скажите пожалуйста, возможно ли написать запрос к БД, при такой задаче:

Есть таблица:

table1
------------
id
num
flag
date

Пример:
id num flag date
--- ----- ----- -----
1 | 1 | 0 | 1.01.2010
2 | 1 | 1 | 6.01.2010
3 | 1 | 0 | 4.01.2010
4 | 2 | 0 | 1.01.2010
5 | 2 | 0 | 4.01.2010
6 | 3 | 0 | 1.01.2010
7 | 3 | 1 | 3.01.2010
8 | 3 | 0 | 2.01.2010

Необходимо выбрать num на последнюю дату, и сначала вывести все флаги = 0(приоритет для флагов=0).

В результате должно получиться:
id num flag date
--- ----- ----- -----
5 | 2 | 0 | 4.01.2010
7 | 3 | 1 | 3.01.2010
2 | 1 | 1 | 6.01.2010

Я сделала, так:

SELECT num FROM table1 ORDER BY flag, date

но у меня значения num дублируются для обоих флагов( как этого избежать?
Distinct(num) не работает, видимо потому что флаги разные.



Спустя 1 час, 43 минуты, 12 секунд (1.08.2010 - 14:25) REANIMATOR написал(а):
вообщето это distinct, а не Distingt

Спустя 2 часа, 12 минут, 12 секунд (1.08.2010 - 16:37) arvitaly написал(а):
select id,num,flag,date from table1 order by flag, date desc group by date


Только date лучше переименовать - системное слово

Спустя 14 часов, 14 минут, 32 секунды (2.08.2010 - 06:51) zvezda_t написал(а):
Цитата (arvitaly @ 1.08.2010 - 13:37)
select id,num,flag,date from table1 order by flag, date desc group by date



к сожалению не работает(
Вышла ошибка:
Incorrect syntax near the keyword 'group'.

Спустя 21 минута, 32 секунды (2.08.2010 - 07:13) zvezda_t написал(а):
SELECT num, MAX(date1) FROM  dbo.table1 
Group By num ORDER BY MAX(date1)


такой запрос вывел все num на максимальную дату и отсортировал по дате.
А как дополнительно отсортировать еще и по флагу?

Пример:
id num flag date
--- ----- ----- -----
1 | 1 | 0 | 1.01.2010
2 | 1 | 1 | 6.01.2010
3 | 1 | 0 | 4.01.2010
4 | 2 | 0 | 1.01.2010
5 | 2 | 0 | 4.01.2010
6 | 3 | 0 | 1.01.2010
7 | 3 | 1 | 3.01.2010
8 | 3 | 0 | 2.01.2010

Результат запроса:

num date
----- -----
3 | 3.01.2010
2 | 4.01.2010
1 | 6.01.2010


строки:
7 | 3 | 1 | 3.01.2010
5 | 2 | 0 | 4.01.2010
2 | 1 | 1 | 6.01.2010

полученные строки нужно отсортировать по флагу :
должно быть:
5 | 2 | 0 | 4.01.2010
7 | 3 | 1 | 3.01.2010
2 | 1 | 1 | 6.01.2010

Спустя 44 минуты, 31 секунда (2.08.2010 - 07:58) zvezda_t написал(а):
блин( самое ужасное - что при таком запросе
SELECT num, MAX(date1) FROM  dbo.table1 
Group By num ORDER BY MAX(date1)

я не могу id строки получить...
что же делать?

Спустя 1 час, 14 минут, 47 секунд (2.08.2010 - 09:12) zvezda_t написал(а):
есть решение:
SELECT  t1.* 
FROM dbo.table1 t1
right join (select num, MAX(date1) maxdate
from table1
Group By num) t2 on t2.maxdate=t1.date1 and t1.num=t2.num
ORDER BY t1.flag, t1.date1


_____________

Что ты сделал сегодня - для завтра?
"Приидите ко Мне вси труждающиеся и обремененнии и Аз упокою вы, возмите иго Мое на себе и научитеся от Мене яко кроток есмь и смирен сердцем и обрящете покой душам вашим, иго бо Мое благо и бремя Мое легко есть."(Мф. 11:28-30)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.