меня есть одна джойню одну таблицу с другой по номеру телефона. В первой таблице 1 запись с этим номером, а во второй их 10, но с разными датами. Как можно заджойнить так, чтобы бралась запись со второй таблицы только с самой ближайшей датой к дате с первой таблицы? По итогу должны выходить только одна запись
Как вариант — какое-нибудь вот такое извращение: select * from mytable t1 join myanothertable t2 on t1.phone = t2.phone and t2.datefield = (select t21.datefield from myanothertable t21 where t21.phone = t2.phone order by @(extract(epoch from t21.datefield) - extract(epoch from t1.datefield)) asc, sign((extract(epoch from t21.datefield) - extract(epoch from t1.datefield))) desc limit 1)
Ахаххаах прикольно вариант, сейчас рассмотрю, спасибо:)
SELECT * FROM t1 CROSS JOIN LATERAL ( SELECT * FROM t2 WHERE t2.phone = t1.phone ORDER BY t2.datefield DESC LIMIT 1 ) t2 если хочется получать записи без звонков, заменить CROSS на LEFT и добавить ON TRUE
круто, спасибо!
Ему вроде надо взять со второй таблицы запись у который колонка даты, самая ближайшая к колонке с датой записи в первой таблице А твой вариант получается выберет просто самую свежу дату из второй таблицы
если так, то просто ORDER BY ABS(t1.datefield - t2.datefield)
7 дек - 2 дек = |5| 7 дек - 12 дек = |5| Какая дата ближе?
И еще ABS работает только с numeric_type, а не все математические операции с датами на выходе дадут его
правильно. обе одинаково ближе, обе удовлетворяют условию. вернётся только одна по LIMIT 1
А, да, ты прав, я не так понял
можно у вас уточнить для чего здесь @?
Чтобы брать разницу в секундах между датами по модулю: в вашем описании не указано было, должна ли быть дата из второй таблицы больше или меньше, чем из первой, поэтому берутся все даты и разница ищется по модулю, при этом если две одинаковые разницы, то дальше через sign сортируем по положительным, потом по отрицательным разницам
Понял, извиняюсь, что не уточнил. Дата во второй всегда больше должна быть, поменяю условие на обычную разницу тогда, спасибо большое еще раз))
Если дата из второй таблицы должна быть больше, то тогда эта задача решается еще проще select * from mytable t1 join myanothertable t2 on t1.phone = t2.phone and t2.datefield = (select min(t21.datefield) from myanothertable t21 where t21.phone = t2.phone and t21.datefield >= t1.datefield)
Обсуждают сегодня