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

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

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



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

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




Добрый день.

Используется 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
На форуме: 3 года, 1 месяц, 3 дня
Карма: 11




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

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


WHERE
id_price NOT IN (
SELECT


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

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

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



Лысый и злой
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 25994
Пользователь №: 21350
На форуме: 6 лет, 8 месяцев, 25 дней
Карма: 725

Не курю:
1 год, 2 месяца, 12 дней


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

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

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

WHERE
    id_price NOT IN (
        SELECT




--------------------
Халявные ответы кончились.
Если нужен готовый код - готовьтесь заплатить.
Райкин тоже был артист

Возле дома был сарай
А когда всё хорошо
Можно просто покурить

user posted image
http://ufa102.xyz/
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Strannik  
 ۩  [x]    Дата
Цитировать сообщение

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



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

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




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

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


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
На форуме: 3 года, 1 месяц, 3 дня
Карма: 11




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

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

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

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