SQL Oracle --- получить последнюю запись за каждый месяц - PullRequest
1 голос
/ 29 октября 2011

У меня есть таблица, содержащая некоторые данные проверки. Каждый товар должен проверяться каждый месяц. Цель здесь - найти последнюю проверенную запись за каждый месяц.

Проверка таблицы:

INSPECTION_I -------- INSPECTION_TS

200 --------------------------- 20.10.2011

201 ---------------------------- 10/24/2011 г.

202 ---------------------------- 10/26/2011

Таблица Product_Inspection:

INSPECTION_I ------------------ ASSET_I

200 ------------------------------------ 1000

201 ------------------------------------ 2000

Таблица Box_Inspection

INSPECTION_I -------- ASSET_I

202 ------------------------ 3000

Таблица товаров

ASSET_I ------------ ASSOCIATED_BOX_ASSET_I

1000 --------------------------- 3000

Таблица BOX:

ASSET_I ------------ OTHER_STUFF

3000 * -------------------- ##### 1053 *

Теперь в данном случае я хочу 201 , а не 200 . Я пытался сделать MAX (to_char (inspe_ts, 'mm / yyyy')) , но это не помогает. Есть еще одна проблема. По какой-то причине я продолжаю получать декартово в случае, когда Продукт или Коробка проверяются дважды или более в месяц. Все, что я хочу, это один осмотр каждый месяц, и это должен быть последний осмотр за каждый месяц. Я действительно близок к получению этого, но если кто-то может помочь, я был бы очень признателен. Мне удалось сделать это с помощью вложенного курсора, но я не хочу этого.

Ответы [ 2 ]

3 голосов
/ 29 октября 2011

Я склонен использовать аналитические функции для выполнения таких запросов. Что-то вроде:

with data as
(
    select 1 product_id, 100 inspection_id, to_date('09/04/2011', 'MM/DD/YYYY') inspection_date from dual union all
    select 1 product_id, 101 inspection_id, to_date('09/14/2011', 'MM/DD/YYYY') inspection_date from dual union all
    select 1 product_id, 103 inspection_id, to_date('10/04/2011', 'MM/DD/YYYY') inspection_date from dual union all
    select 1 product_id, 105 inspection_id, to_date('11/01/2011', 'MM/DD/YYYY') inspection_date from dual union all
    select 2 product_id, 102 inspection_id, to_date('09/24/2011', 'MM/DD/YYYY') inspection_date from dual union all
    select 2 product_id, 104 inspection_id, to_date('10/05/2011', 'MM/DD/YYYY') inspection_date from dual
)
select *
from 
(
    select
        product_id,
        inspection_id,
        inspection_date,
        row_number() over (
            partition by
                product_id,
                trunc(inspection_date, 'MM') -- Month
            order by
                inspection_date desc
        ) rn
    from
        data
)
where rn = 1 -- indicates last inspection date of the month for each product
0 голосов
/ 29 октября 2011

использовать подзапрос

Select [ColName List]
From TableName a
Where DateTimeColumname 
   = (Select Max(DateTimeColumnName)
      From TableName 
      Where DateTimeColumnName < 1+Last_Day(a.DateTimeColumnName))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...