Здравствуйте!
Не знаю, как точно объяснить задачу, но смысл приблизительно такой... Если таблица содержащая счета, даты и статусы этих счетов. Статус может меняться в течение месяца! Так вот, нужно выбрать за месяц те счета и подсчитать их кол-во, у которых к концу текущего месяца статус подпадает под условие выборки (STATUS='-') и после не изменился, опять-же в текущем месяце! Выборка по MAX(DATE) не подходит, т.к. выводит максимальную дату с нужным статусом счёта, но далее не проверяет изменился-ли статус после...
Я набросал схематичную табличку ниже - так вот, если соблюдать условия запроса, то в выборку не должны попасть ни счёт 1001, ни 1002, т.к. к максимальной дате последний их статус изменился на "+"... А вот счёт 1003 - попадает в итоговую выборку...
Как смог объяснил...
Знаний мало, прошу простить, но очень надеюсь на помощь знающих людей! Заранее очень благодарен откликнувшимся!
ACC STATUS DATE
1001 + 2014-01-01
1002 - 2014-01-02
1001 + 2014-01-03
1001 - 2014-01-04
1002 + 2014-01-05
1002 - 2014-01-06
1003 - 2014-01-06
Как создать выборку по макс. дате...?
Попробуй так, должно работать:
Скажи если что-то не совпало
Код: Выделить всё
SELECT acc FROM (
SELECT acc, max(date) "date"
FROM status_history
GROUP BY acc
) hist
JOIN status_history h2 ON hist.date = h2.date AND hist.acc = h2.acc
WHERE h2.status = '-'
Bce_OK писал(а):Попробуй так, должно работать:Скажи если что-то не совпалоКод: Выделить всё
SELECT acc FROM ( SELECT acc, max(date) "date" FROM status_history GROUP BY acc ) hist JOIN status_history h2 ON hist.date = h2.date AND hist.acc = h2.acc WHERE h2.status = '-'
Спасибо за помощь! Не совсем так как нужно работает... Я считал, что можно сделать приблизительно так - сначала отобрать счета, которые с МАХ датой и статусом "-", а после те, у которых МАХ дата, но статус "+", после сделать JOIN по условию, что дата со статусом "+" меньше даты со статусом "-" и в итог выводить только те счета, которые попадают под это условие... Только я окончательно запутался Вот такой итог...
Не знаю, актуально ли еще...
Не совсем тебя понял. Но с твоих слов примерно так получается:l_2001 писал(а): ...
сначала отобрать счета, которые с МАХ датой и статусом "-", а после те, у которых МАХ дата, но статус "+", после сделать JOIN по условию, что дата со статусом "+" меньше даты со статусом "-" и в итог выводить только те счета, которые попадают под это условие
...
Код: Выделить всё
SELECT acc FROM
(
SELECT acc, max(date) "date"
FROM status_history
WHERE status = '-'
GROUP BY acc
) max_date_minus
JOIN
(
SELECT acc, max(date) "date"
FROM status_history
WHERE status = '+'
GROUP BY acc
) max_date_plus
ON max_date_plus.acc = max_date_minus.acc
WHERE max_date_plus.date < max_date_minus.date
Спасибо! Я так и сделал, после долгих мытарств! Это оказалось самое оптимальное решение!
Но лучше поздно, чем никогда!
Ещё раз спасибо!
Значит я не совсем так глуп, как кажется
Но лучше поздно, чем никогда!
Ещё раз спасибо!
Значит я не совсем так глуп, как кажется