[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Коварный DISTINCT
gidrosoldat
Простенький запрос:

'SELECT `xxx`,
`yyy`,
`zzz`
FROM `table`'

Мне нужно его изменить - вытащить строчки с уникальным `xxx`.
Если делаю так:

'SELECT DISTINCT `xxx`,
`yyy`,
`zzz`
FROM `table`'

То вытаскивается уникальная `xxx`, `yyy`, `zzz` комбинация - свойство DISTINCT распространяется на все аргументы что идут через запятую. Как сделать уникальным только одно поле `xxx` из списка `xxx`, `yyy`, `zzz`?



Спустя 9 часов, 22 минуты, 54 секунды (13.01.2011 - 12:18) Snus написал(а):
SELECT `xxx`, `yyy`, `zzz`
FROM `table`
GROUP BY `xxx`

Спустя 11 минут, 12 секунд (13.01.2011 - 12:29) sergeiss написал(а):
Если в Постгре, то
select distinct on (xxx) xxx, yyy, zzz from your_table


PS. Народ! Указывайте БД, с которой работаете!!! В разных версиях SQL может быть своя специфика.

Спустя 17 минут, 52 секунды (13.01.2011 - 12:47) Snus написал(а):
sergeiss
select distinct on (xxx) xxx, yyy, zzz from your_table


Distinct лучше не использовать, ибо запрос выполняется дольше, чем Group

Спустя 31 минута, 10 секунд (13.01.2011 - 13:19) sergeiss написал(а):
Snus - зависит от БД smile.gif Если ты попробуешь запустить "свой" запрос в Постгре то будешь неприятно удивлен... Потому что будет ошибка. А "мой" запрос, как я понимаю, не пройдет в MySQL.

Спустя 14 минут, 9 секунд (13.01.2011 - 13:33) Snus написал(а):
sergeiss
Честно говоря, у меня сейчас нет времени вникать в тонкости Постгре и мне интересно было бы услышать от Вас, чем же данный SQL не пройдет? И хорошо бы показать использование GROUP BY в постгре с рабочим примером .

Спустя 23 минуты, 44 секунды (13.01.2011 - 13:56) sergeiss написал(а):
Цитата (Snus @ 13.01.2011 - 14:33)
Честно говоря, у меня сейчас нет времени вникать в тонкости Постгре и мне интересно было бы услышать от Вас, чем же данный SQL не пройдет? И хорошо бы показать использование GROUP BY в постгре с рабочим примером .

Постгре в явном виде требует, чтобы указанные в выражении GROUP BY колонки имели уникальные выражения. Точнее, они даже не проверяются...

В Постгре вот так можно:
SELECT xxx, func1( yyy ) as new_yyy, func2( zzz ) as new_zzz FROM table1 GROUP BY xxx


Это выражение говорит о том, что надо сгруппировать все строки с уникальными значениями из колонки xxx, при этом к выражениям из колонок yyy и zzz надо применить указанные функции. Это могут быть суммирование, усреднение или что-то еще, но только не выражения в чистом виде. Потому что Постгре подразумевает, что там могут быть неодинаковые выражения и он не знает, какое из них показывать в итоге. Поэтому такой запрос просто не будет запущен.
В Постгре надо четко разделять DISTINCT и GROUP BY, потому что у них, на самом деле, разные назначения, цели.

Вот более "живой" (хотя и абстрактный) пример:
SELECT xxx, sum( yyy ) as sum_yyy, avg( zzz ) as avg_zzz, 100.*sum( yy2 + yy4)/ sum( zzz65 ) as first_rate FROM table1 GROUP BY xxx


А вот совсем "живой" пример, живее просто некуда :) Только сегодня делал выборку, показываю целиком запрос, как он был сделан (сначала выбираются данные, а потом они группируются и обрабатываются):
select month, lac, cellid, sum( csmsup+tsmsup) as sms_count, 24.0*sum(CTRALACC)/sum(CNSCAN+1e-15) as sdcch_traf, 
sum(1.0*THTRALACC/(THNSCAN+1e-15 )+ 1.0*TFTRALACC/(TFNSCAN+ 1e-15)) as traf
from
(
select date_part( 'month', date_) as month ,lac, cellid, csmsup, tsmsup, CTRALACC, CNSCAN, THTRALACC, THNSCAN, TFTRALACC, TFNSCAN
from stat_eri_bts
where h=24 and date_ between '2010-10-01' and '2010-12-31' and cellid>0 and lac=30100
) ini
group by month, lac, cellid
order by lac, cellid, month


PS. В таблице stat_eri_bts 19044600 записей, выборка была сделана за 8,4 секунды.

Спустя 3 часа, 42 минуты, 40 секунд (13.01.2011 - 17:39) gidrosoldat написал(а):
Snus, sergeiss спасибо.
О GROUP сам уже нашел, а метод sergeiss'a на моем мускуле не пашет ...
Пробовал на Денвере:
* Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k PHP/5.3.1
* MySQL client version: mysqlnd 5.0.5-dev - 081106 - $Revision: 289630 $
* PHP extension: mysql

Снова конкретезирую
Есть таблица данных, в ней два столбца - number и date. В столбце date даты, все разные, в столбце number числа, которые время от времени повторяются.

Пример:
1 | 2011-01-12 22:35:21
1 | 2011-01-12 22:36:17
6 | 2011-01-12 22:37:39
3 | 2011-01-12 22:38:13
4 | 2011-01-12 22:38:41
6 | 2011-01-12 22:39:14

Задача: выбрать из этих двух столбцов таблицу данных с уникальными значениями number с самыми поздними значениями date.

Результат должен быть такой:
1 | 2011-01-12 22:36:17
3 | 2011-01-12 22:38:13
4 | 2011-01-12 22:38:41
6 | 2011-01-12 22:39:14

Мои потуги ничем не хорошим не увенчались.
Пробовал такое:
'SELECT `number`, 
`date`
FROM `table`
ORDER BY `date` DESC
GROUP BY `number`
'

Не хочет выполнять, выдает ошибку. Если поменять местами строки с ORDER и GROUP, то он сортирует по дате в уже сформированной группе - не годится.
Вообщем, похоже я в тупике.

Спустя 3 минуты, 50 секунд (13.01.2011 - 17:43) Snus написал(а):
GROUP BY должен идти перед ORDER BY


'SELECT `number`,
`date`
FROM `table`
GROUP BY `number`
ORDER BY `date` DESC


Спустя 2 минуты, 9 секунд (13.01.2011 - 17:45) gidrosoldat написал(а):
Ничего не получится, так как он отсортирует в уже отобранной группе (а в эту группу попадают строки идущие раньше по таблице, посдние даты уже окажутся "за бортом").

Спустя 52 минуты, 40 секунд (13.01.2011 - 18:38) Snus написал(а):

'SELECT `number`, MAX(`date`) AS `mxd`
`date`
FROM `table`
GROUP BY `number`
ORDER BY `mxd`



А так?

Спустя 1 час, 40 минут, 55 секунд (13.01.2011 - 20:19) gidrosoldat написал(а):
Вроде работает ))
А теперь ворпрос со звездочкой!
Если столбцов в таблице не 2, а 3. Скажем вот так:

1 | 2011-01-12 22:35:21 | string1
1 | 2011-01-12 22:36:17 | string2
6 | 2011-01-12 22:37:39 | string3
3 | 2011-01-12 22:38:13 | string4
4 | 2011-01-12 22:38:41 | string5
6 | 2011-01-12 22:39:14 | string6

Как получить результат:


1 | 2011-01-12 22:36:17 | string2
3 | 2011-01-12 22:38:13 | string4
4 | 2011-01-12 22:38:41 | string5
6 | 2011-01-12 22:39:14 | string6

То есть, условия похожие, но к дате и числу теперь превязанна определенная строка.
П.С. Я не из простого любопытства спрашиваю.

Спустя 1 час, 53 минуты, 45 секунд (13.01.2011 - 22:12) kirik написал(а):
Цитата (Snus @ 13.01.2011 - 04:47)
Distinct лучше не использовать, ибо запрос выполняется дольше, чем Group

DISTINCT may use GROUP BY. Так что особой разницы в данном запросе нет.

Спустя 10 часов, 53 минуты, 35 секунд (14.01.2011 - 09:06) gidrosoldat написал(а):
А решения, между прочим, такoe
http://www.mysql.ru/docs/mysql-man-4.0-ru/...olumn-group-row
Быстрый ответ:

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