Как создать выборку по макс. дате...?

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
l_2001
Сообщения: 3
Зарегистрирован: 15 ноя 2014, 14:45

15 ноя 2014, 15:25

Здравствуйте!
Не знаю, как точно объяснить задачу, но смысл приблизительно такой... Если таблица содержащая счета, даты и статусы этих счетов. Статус может меняться в течение месяца! Так вот, нужно выбрать за месяц те счета и подсчитать их кол-во, у которых к концу текущего месяца статус подпадает под условие выборки (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
Bce_OK
Сообщения: 8
Зарегистрирован: 18 ноя 2014, 20:25

19 ноя 2014, 11:15

Попробуй так, должно работать:

Код: Выделить всё

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 = '-'
Скажи если что-то не совпало
l_2001
Сообщения: 3
Зарегистрирован: 15 ноя 2014, 14:45

19 ноя 2014, 12:57

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 по условию, что дата со статусом "+" меньше даты со статусом "-" и в итог выводить только те счета, которые попадают под это условие... Только я окончательно запутался :( Вот такой итог...
Bce_OK
Сообщения: 8
Зарегистрирован: 18 ноя 2014, 20:25

24 дек 2014, 01:04

Не знаю, актуально ли еще...
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
l_2001
Сообщения: 3
Зарегистрирован: 15 ноя 2014, 14:45

26 дек 2014, 09:47

Спасибо! Я так и сделал, после долгих мытарств! Это оказалось самое оптимальное решение!
Но лучше поздно, чем никогда!
Ещё раз спасибо!
Значит я не совсем так глуп, как кажется :)
Ответить