Условие в GROUP BY

vfvtnjd

У меня в таблице есть записи, где все значения совпадают, кроме полей автоинкремента и имени клиента. Проблема в том, нужно убрать лишнюю, если flat одинаковые у клиентов, оставить у кого agrm_id больше.Например, agrm_id|name|flat|------------------1234| Иван |5|1267|Петр |5|------------------В таком случае оставить Петр-а, так как у него agrm_id>чем agrm_id Ивана.Подскажите.
6 ответов

vfvtnjd

vfvtnjd,"убрать" - это удалить, или просто НЕ выводить ?для 2
select * from T t1
where not exists (select 1 from T t2 where t1.flat=t2.flat and t1.agrm_id<t2.agrm_id)


vfvtnjd

удалять не надо, а просто не выводить


vfvtnjd

Вот такой вот делаю запрос.
SELECT ad_inv.object_id
 , ad_inv.flat
 , ad_inv.podezd_id
 , ad_inv.flat_position
 , ad_inv.flat_type
 , ag.agrm_id
 , a.name
 , a.mobile
 FROM
 addr_inventory ad_inv
LEFT JOIN agreements ag/*Связываем с квартирами абонентов, здесь и нужно убрать лишнего*/
ON (substr(ag.number, 1, 5) = trim(ad_inv.object_id) AND (agrmtoflat(ag.agrm_id, ag.uid) = ad_inv.flat) AND trim(ad_inv.object_id) = trim("AS-12"))
LEFT JOIN accounts a
ON (ag.uid = a.uid)
WHERE
 ad_inv.podezd_id = 1/*первый подъезд*/
 AND ad_inv.object_id = trim("AS-12")/*шифр объекта*/
GROUP BY
 ad_inv.etazh
, ad_inv.flat_position
, ag.agrm_id
ORDER BY
 ad_inv.etazh DESC;


vfvtnjd

Вот такой вот делаю запрос.
омгкакаяжесть... связь по тримам и сабстрингам... ещё и по каким-то функциям, скорее всего ещё и дёргающим др.таблицы... Ну вот так попробуйте:
...
 FROM
 addr_inventory ad_inv
LEFT JOIN 
(select * from agreements t1
where not exists (select 1 from agreements t2 where t1.flat=t2.flat and t1.agrm_id<t2.agrm_id) 
) ag
ON (substr(...
хотя, конечно, с такой структурой как ни изгаляйся, а по скорости полный пэ будет...


vfvtnjd

нуу, если тупо, и не думаю, то так
Вот такой вот делаю запрос.
SELECT ad_inv.object_id
 , ad_inv.flat
 , ad_inv.podezd_id
 , ad_inv.flat_position
 , ad_inv.flat_type
 , ag.agrm_id
 , a.name
 , a.mobile
 FROM
 addr_inventory ad_inv
LEFT JOIN 

 <span>(</span><span>select</span> <span>*</span> <span>from</span> agreements t1
 <span>where</span> <span>not</span> <span>exists</span> <span>(</span><span>select</span> 1 <span>from</span> agreements t2 <span>where</span> t1<span>.</span>flat=t2<span>.</span>flat <span>and</span> t1<span>.</span>agrm_id<t2<span>.</span>agrm_id<span>))</span> ag

ON (substr(ag.number, 1, 5) = trim(ad_inv.object_id) AND (agrmtoflat(ag.agrm_id, ag.uid) = ad_inv.flat) AND trim(ad_inv.object_id) = trim("AS-12"))
LEFT JOIN accounts a
ON (ag.uid = a.uid)
WHERE
 ad_inv.podezd_id = 1/*первый подъезд*/
 AND ad_inv.object_id = trim("AS-12")/*шифр объекта*/
GROUP BY
 ad_inv.etazh
, ad_inv.flat_position
, ag.agrm_id
ORDER BY
 ad_inv.etazh DESC;
а "думать", на "фоне" такой х-раты
ON (substr(ag.number, 1, 5) = trim(ad_inv.object_id) AND (agrmtoflat(ag.agrm_id, ag.uid) = ad_inv.flat) AND trim(ad_inv.object_id) = trim("AS-12"))
и не обязательно ...


vfvtnjd

упс :))