Запрос Postgres для отчета - PullRequest
       1

Запрос Postgres для отчета

0 голосов
/ 21 сентября 2018

Я пытаюсь решить эту проблему:

У меня есть запрос / представление, которое объединит ~ 10 таблиц для извлечения некоторых полей для отчета (если таковые имеются).Запрос не использует никакой функции группировки, он только объединяет и обрезает некоторые ненужные данные.

Мне нужно одно большое представление, получить группу для первого индекса, взять максимум даты ввторой столбец и взять всю информацию из других полей, ссылаясь на запись максимального значения.

Я не могу сделать это в postgres.В качестве псевдокода я могу дать следующее:

select 1
     , max(2)
     , 3 referred to the record from max(2)
     , 4 referred to the record from max(2)
     , ...
     , 20 referred to the record from max(2)
  from (ViewWithAllJoins) a
group by 1

В связи с проблемами конфиденциальности и бизнеса мне пришлось запутать некоторые сведения, 1/2/3/4 ... это название столбца из представления "ViewWithAllJoins ", я надеюсь, что проблема все еще понятна и разрешима!

Я попытался с помощью команды WINDOW, как сообщается в Преобразовать keep_plus из запроса Oracle в postgres , но я не могуиспользовать группу, которая мне нужна.Другие попытки, которые я делал, были о файле diff_rank, как показано в Dense_rank, сначала Oracle в Postgresql, конвертировали , но я не могу делать никаких предположений о порядке данных в других полях, кроме 1и 2, поэтому я не могу использовать для них какую-либо статистическую функцию.

Есть идеи?Возможно, не добавляя слишком много подзапросов.

Спасибо!

РЕДАКТИРОВАТЬ:

Как предложено, я добавлю некоторые синтетические данные, чтобы лучше понять проблему и то, что я хочу.

Начало:

    ID             DATE            COLUMN1      COLUMN2     COLUMN3
=====================================================================
 88888888;"2016-04-02 09:00:00";"aaaaaaaaaaa";"TEXT89"    ; 999999999
 88888888;"2018-08-21 09:00:00";"a"          ;"TEXT1"     ; 988888888
 88888888;"2017-11-09 09:00:00";"zzzz"       ;"TEXT80000" ; 850580582
 75858585;"2017-01-31 09:00:00";"~~~~~~~~~~~";"TEXT10"    ; 101010101
 75858585;"2018-04-02 09:00:00";"eeeeeeeeeee";"TEXT1000"  ; 111111111
 99999999;"2016-04-02 09:00:00";"8d2ecafd866";"TEXT808911"; 777777777

Что я хочу:

    ID             DATE            COLUMN1      COLUMN2     COLUMN3
===================================================================
 88888888;"2018-08-21 09:00:00";"a"          ;"TEXT1"     ; 988888888
 75858585;"2018-04-02 09:00:00";"eeeeeeeeeee";"TEXT1000"  ; 111111111
 99999999;"2016-04-02 09:00:00";"8d2ecafd866";"TEXT808911"; 777777777

Таким образом, группа по идентификатору, максимуму даты и другим полям, связанным со строкоймаксимальная дата.

1 Ответ

0 голосов
/ 24 сентября 2018

- То есть у вас есть дубликаты записей для каждого идентификатора, и для каждого идентификатора вы хотите выбрать запись с самой последней датой?

Используйте NOT EXISTS:


SELECT id,zdate,column1,column2,column3 -- , ...
FROM queryview t
WHERE NOT EXISTS (
        SELECT *
        FROM queryview x
        WHERE x.id=t.id
        AND x.zdate > t.zdate
        );

Или используйте row_number () над окном и выберите только строку с конечной датой:


SELECT id,zdate,column1,column2,column3 -- , ...
FROM ( SELECT *
        , row_number() OVER(PARTITION BY id, ORDER BY zdate DESC) AS rn
        FROM queryview
        ) q
WHERE q.rn = 1
        ;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...