Чтобы найти последнюю обновленную запись каждого месяца для каждой политики (другое поле)

У меня есть таблица с именем a, а другие поля - с именем eff_date,policy no.

Теперь для каждой политики рассмотрите все записи и извлеките последнюю обновленную (eff_date) за каждый месяц.

Поэтому мне нужна последняя обновленная запись за каждый месяц для каждой политики. Как мне написать для этого запрос?


person RRR    schedule 18.06.2013    source источник
comment
Какую СУБД и версию вы используете?   -  person Lamak    schedule 18.06.2013
comment
Для какой СУБД это? Важно выделить месяцы и сгруппировать по комбинации month и policy_no.   -  person Menelaos    schedule 18.06.2013


Ответы (3)


Я не на 100 процентов разбираюсь в синтаксисе Teradata, но полагаю, что вы после этого:

SELECT policy_no,eff_date
FROM (SELECT policy_no,eff_date, ROW_NUMBER() OVER (PARTITION BY policy no, EXTRACT(YEAR FROM eff_date),EXTRACT(MONTH FROM eff_date) ORDER BY eff_date DESC) as RowRank
      FROM a) as sub
WHERE RowRank = 1

Я предполагаю, что когда вы говорите по месяцам, вы также хотите дифференцировать по годам, но если нет, просто удалите EXTRACT (YEAR FROM eff_date) из раздела PARTITION BY.

Изменить: обновление синтаксиса Teradata.

person Hart CO    schedule 18.06.2013
comment
Хм, я не очень хорошо знаком с Teradata, вы можете без проблем выполнить внутренний запрос? - person Hart CO; 18.06.2013
comment
SELECT *, ROW_NUMBER () OVER (РАЗДЕЛ ПО policy_no, EXTRACT (ГОД ИЗ eff_dt), EXTRACT (МЕСЯЦ ИЗ eff_dt) ORDER BY eff_dt DESC) ИЗ - person RRR; 18.06.2013
comment
Что, если вы укажете поля вместо *? - person Hart CO; 18.06.2013
comment
ROW_NUMBER () - это функция, которая добавляет число, например ранжирование, к каждой строке результатов. - person Hart CO; 18.06.2013
comment
Это получение всех дат месяца. Я не получаю только последнюю обновленную дату за месяц. Кроме того, номер политики отображается как 1,2,3 и т. Д., А не исходный номер политики. - person RRR; 18.06.2013
comment
Да, внутренний запрос добавляет номер строки к каждой дате, внешний запрос затем ограничивается на основе рейтинга строк, который ограничен последним обновлением за месяц, просмотрите обновленный ответ. - person Hart CO; 18.06.2013
comment
Надеюсь, он работает нормально. но номера политик отображаются как 1,2 и т. д. мне нужно, чтобы отображались реальные номера политик - person RRR; 18.06.2013

Основная трудность заключается в том, что group by необходимо сделать как комбинацией policy_no, так и месяца (извлеченного из даты). Например:

В Mysql

    SELECT policy_no,
       month(eff_date),
       year(eff_date),
       max(eff_date)
FROM myTable
GROUP BY policy_no,
         month(eff_date),
         year(eff_date);

Обновлять

Я видел, что производные таблицы разрешены в тераданных. Используя соединение с производной таблицей, вот как получить доступ ко всем строкам:

select * from a,
(SELECT policy_no,
       month(eff_date),
       year(eff_date),
       max(eff_date) as MaxMonthDate
FROM a
GROUP BY policy_no,
         month(eff_date),
         year(eff_date)
 ) as b
where a.policy_no = b.policy_no and
a.eff_date = b.MaxMonthDate;

http://www.sqlfiddle.com/#!2/1f728/5

Обновление (с использованием извлечения)

select * from a,
    (SELECT a2.policy_no,
           EXTRACT(MONTH FROM a2.eff_date),
           EXTRACT(YEAR FROM  a2.eff_date),
           max(a2.eff_date) as MaxMonthDate
    FROM a as a2
    GROUP BY a2.policy_no,
             EXTRACT(MONTH FROM a2.eff_date),
             EXTRACT(YEAR FROM  a2.eff_date)
     ) as b
    where a.policy_no = b.policy_no and
    a.eff_date = b.MaxMonthDate;
person Menelaos    schedule 18.06.2013
comment
Из вопроса я думаю, что op хочет последнюю обновленную строку (например, каждый столбец) в месяц для каждой политики. Не только максимальная дата. - person Lamak; 18.06.2013
comment
Спасибо, что исправили. - person Menelaos; 18.06.2013
comment
не совсем. Вы все еще просто берете максимальное значение для eff_date, когда я считаю, что ему нужна вся строка для этого максимального eff_date. Это достигается в ответе Goat_CO - person Lamak; 18.06.2013
comment
@ user2497982, я обновил свой запрос, чтобы предоставить всю информацию, используя соединение с производной таблицей. - person Menelaos; 18.06.2013
comment
Выдача ошибки Все выражения в производной таблице должны иметь явное имя - person RRR; 18.06.2013
comment
Я подозреваю, что вместо функций month() и year() терадата может использовать Extract(MONTH FROM field) или EXTRACT(YEAR FROM field). Кроме того, проблема может заключаться в том, что вам нужно добавить префикс b. к MaxMonthDate так: b.MaxMonthDate в предложении where. - person Menelaos; 18.06.2013

Я собираюсь предложить изучить агрегатные функции Windows и оператор QUALIFY. Я считаю, что следующий SQL будет работать.

SELECT Policy_No
     , EXTRACT(MONTH FROM Eff_Date) AS Eff_Month_
     , Eff_Date
  FROM TableA
QUALIFY ROW_NUMBER() OVER (PARTITION BY Policy_No, EXTRACT(MONTH FROM Eff_Date) 
                           ORDER BY Eff_Date DESC) = 1;
person Rob Paller    schedule 19.06.2013