Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Как правильно сделать Group by?
Strannik  
 ۩  [x]    Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 806
Пользователь №: 17108
На форуме: 16 лет, 7 дней
Карма: 1




Добрый день.

Используется MSSQL 2008

SELECT TOP 20 
p.id_price as p_id_price,
p.id_service as p_id_service,
p.name as p_name,
p.name_original as p_name_original,
p.id_producer_country as p_id_producer_country,
p.id_firm as p_id_firm,
f.name as f_name,
f.priority as f_priority,
f.address as f_address,
f.phone as f_phone,
city.name as city_name,
pc.name as pc_name
FROM Price p
left join Firm f on f.id_service = p.id_service AND f.id_city = p.id_city AND f.id_firm = p.id_firm
left join City city on city.id_city = p.id_city left join Producer_country pc on pc.id_producer_country = p.id_producer_country
left join Dogovor d on d.id_service=p.id_service AND d.id_city=p.id_city AND d.id_firm=p.id_firm
WHERE
id_price NOT IN (
SELECT TOP 20 p.id_price
FROM Price p
left join Firm f on f.id_service = p.id_service AND f.id_city = p.id_city AND f.id_firm = p.id_firm
left join City city on city.id_city = p.id_city
left join Producer_country pc on pc.id_producer_country = p.id_producer_country
left join Dogovor d on d.id_service=p.id_service AND d.id_city=p.id_city AND d.id_firm=p.id_firm
WHERE p.id_city='495' AND p.include='1' AND p.blocked='0' AND f.blocked='0' AND f.dogovor='1'
AND d.end_date >= '20131108 02:37:03'
AND (p.name LIKE '% tes_ %' OR p.name LIKE 'tes_ %' OR p.name LIKE '% _tes_%')
ORDER BY f.priority DESC
)
AND p.id_city='495'
AND p.include='1'
AND p.blocked='0'
AND f.blocked='0'
AND f.dogovor='1'
AND d.end_date >= '20131108 02:37:03'
AND (p.name LIKE '% tes_ %' OR p.name LIKE 'tes_ %' OR p.name LIKE '% _tes_%')

ORDER BY f.priority DESC


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

Если в таблице существуют несколько строк с одинаковым f.name, то должна выбираться строка наиболее соответствующая поиску(или просто последняя строка по дате).

Подскажите как сделать такую выборку?

P.S.: реально ли нумеровать строки по "наиболее соответствующая поиску(или просто последняя строка по дате)." в пределах одинаковых f.name и потом выбирать 1е номера? и как это сделать если да?
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
dr.nomore  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 527
Пользователь №: 38359
На форуме: 11 лет, 4 месяца, 13 дней
Карма: 11




Выражу, наверно, общее мнение: опупеть!

Однако видя конструкции типа


WHERE
id_price NOT IN (
SELECT


у меня лично возникает ощущение что где-то все в корне неправильно. Да, есть такая возможность, но опять же по моему личному мнению она из категории средств восстановления целостности и вообще орудий ремонта БД. Не для повседневной носки, короче, скафандр.

Особенно когда явно все повторяется в условии за и условии против за каким-то неуловимым исключением.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Игорь_Vasinsky  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 26774
Пользователь №: 21350
На форуме: 15 лет, 5 дней
Карма: 756




Цитата
Выражу, наверно, общее мнение: опупеть!

Однако видя конструкции типа

какой-то ты пугливый.
в этом куске нет ничего страшного.
Цитата

WHERE
    id_price NOT IN (
        SELECT




--------------------
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Strannik  
 ۩  [x]    Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 806
Пользователь №: 17108
На форуме: 16 лет, 7 дней
Карма: 1




если бы базу мы делали, вообще проблем бы не возникло, а так как база предоставляется делаем бубны(-

Получился такой вот бубен там-тама:


SELECT * FROM (
SELECT
Row_Number()OVER(PARTITION BY f.name ORDER BY f.priority, p.datetime DESC) AS NameOrder,
p.id_price as p_id_price,
p.id_service as p_id_service,
p.name as p_name,
p.name_original as p_name_original,
p.id_producer_country as p_id_producer_country,
p.id_firm as p_id_firm,
f.name as f_name,
f.priority as f_priority,
f.address as f_address,
f.phone as f_phone,
city.name as city_name,
pc.name as pc_name
FROM Price p
left join Firm f on f.id_service = p.id_service AND f.id_city = p.id_city AND f.id_firm = p.id_firm
left join City city on city.id_city = p.id_city
left join Producer_country pc on pc.id_producer_country = p.id_producer_country
left join Dogovor d on d.id_service=p.id_service AND d.id_city=p.id_city AND d.id_firm=p.id_firm
WHERE
p.id_city='495' AND p.include='1' AND p.blocked='0' AND f.blocked='0' AND f.dogovor='1'
AND d.end_date >= '20131110 12:57:48'
AND (p.name LIKE '% test_ %' OR p.name LIKE 'test_ %' OR p.name LIKE '% _test_%')
)
AS S WHERE S.NameOrder = 1
AND S.p_id_price NOT IN (
SELECT TOP 20 p_id_price FROM(
SELECT Row_Number()OVER(PARTITION BY f.name ORDER BY f.priority, p.datetime DESC) AS SqlAddNameOrder,
p.id_price as p_id_price,

f.priority as f_priority

FROM Price p
left join Firm f on f.id_service = p.id_service AND f.id_city = p.id_city AND f.id_firm = p.id_firm
left join City city on city.id_city = p.id_city
left join Producer_country pc on pc.id_producer_country = p.id_producer_country
left join Dogovor d on d.id_service=p.id_service AND d.id_city=p.id_city AND d.id_firm=p.id_firm
WHERE
p.id_city='495' AND p.include='1' AND p.blocked='0' AND f.blocked='0' AND f.dogovor='1'
AND d.end_date >= '20131110 12:57:48' AND (p.name LIKE '% test_ %' OR p.name LIKE 'test_ %' OR p.name LIKE '% _test_%')
)
AS sqladd
WHERE sqladd.SqlAddNameOrder = 1
)
AND S.p_id_firm NOT IN (
SELECT TOP 20 p_id_firm FROM(
SELECT Row_Number()OVER(PARTITION BY f.name ORDER BY f.priority, p.datetime DESC) AS SqlAddNameOrder,
p.id_firm as p_id_firm,

f.priority as f_priority

FROM Price p
left join Firm f on f.id_service = p.id_service AND f.id_city = p.id_city AND f.id_firm = p.id_firm
left join City city on city.id_city = p.id_city
left join Producer_country pc on pc.id_producer_country = p.id_producer_country
left join Dogovor d on d.id_service=p.id_service AND d.id_city=p.id_city AND d.id_firm=p.id_firm
WHERE
p.id_city='495' AND p.include='1' AND p.blocked='0' AND f.blocked='0' AND f.dogovor='1'
AND d.end_date >= '20131110 12:57:48' AND (p.name LIKE '% test_ %' OR p.name LIKE 'test_ %' OR p.name LIKE '% _test_%')
)
AS sqladd
WHERE sqladd.SqlAddNameOrder = 1
)

ORDER BY S.f_priority DESC

PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
dr.nomore  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 527
Пользователь №: 38359
На форуме: 11 лет, 4 месяца, 13 дней
Карма: 11




Игорь_Vasinsky как неопупевший представили бы оптимальное решение.

Strannik Да, именно оно и приключилось. Теперь вы будете носить скафандр постоянно. Еще есть вариант переделать базу. Ну и сайт заодно, конечно.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса