Как создать набор данных на основе конкретного условия даты? - PullRequest
0 голосов
/ 22 октября 2018

У меня есть набор данных следующим образом

year mon date      org
---- --- --------- ---
2018 mar 21-Mar-18 bb2
2018 mar 19-Mar-18 bbd
2018 feb 17-Feb-18 bbc
2018 feb 15-Feb-18 bba
2018 jan 15-Jan-18 abb
2018 jan 13-Jan-18 abc

, и я пытаюсь получить данные, повторяющиеся следующим образом:

year mon date      org
---- --- --------- ---
2018 mar 21-Mar-18 bb2
2018 mar 19-Mar-18 bbd
2018 mar 17-Feb-18 bbc
2018 mar 15-Feb-18 bba
2018 mar 15-Jan-18 abb
2018 mar 13-Jan-18 abc
2018 feb 17-Feb-18 bbc
2018 feb 15-Feb-18 bba
2018 feb 15-Jan-18 abb
2018 feb 13-Jan-18 abc
2018 jan 15-Jan-18 abb
2018 jan 13-Jan-18 abc

Редактировать: Извините за расплывчатую информацию.Это уникальное требование, которое гласит: «Если пользователь запрашивает месяц, выходные данные должны возвращать все строки выбранного месяца и месяцев до него».

Так что, если вы посмотрите на мой существующийнабор данных (это просто фиктивные данные), если я отфильтрую для mar, я должен получить 6 строк, для 4 февраля и 2 строки для jan и так далее в обратном порядке.Таким образом, общие данные будут состоять из 12 строк в таблице.

Я работаю над версией оракула 11.2.0.3

. Любая идея или входные данные будут высоко оценены.

РЕДАКТИРОВАТЬ 2: Извините, Хаус, я отсутствовал так долго.Требование было отменено, поэтому мы не следовали по этому маршруту.Однако, если кто-то хочет пойти по этому пути, решение состоит в том, чтобы

самостоятельно присоединиться к таблице на «org», а Tab_A.column X -> = Tab_B.column X

, учитывая, что Xновый столбец (на основе года и месяца, например: 201803)

Ответы [ 2 ]

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

Если вам нужны строки, если пользователь проходит через месяц и год, это должно помочь:

WITH your_table AS (SELECT 2018 YEAR, 'mar' mon, to_date('21/03/2018', 'dd/mm/yyyy') dt, 'bb2' org FROM dual UNION ALL
                    SELECT 2018 YEAR, 'mar' mon, to_date('19/03/2018', 'dd/mm/yyyy') dt, 'bbd' org FROM dual UNION ALL
                    SELECT 2018 YEAR, 'feb' mon, to_date('17/02/2018', 'dd/mm/yyyy') dt, 'bbc' org FROM dual UNION ALL
                    SELECT 2018 YEAR, 'feb' mon, to_date('15/02/2018', 'dd/mm/yyyy') dt, 'bba' org FROM dual UNION ALL
                    SELECT 2018 YEAR, 'jan' mon, to_date('15/01/2018', 'dd/mm/yyyy') dt, 'abb' org FROM dual UNION ALL
                    SELECT 2018 YEAR, 'jan' mon, to_date('13/01/2018', 'dd/mm/yyyy') dt, 'abc' org FROM dual)
-- end of sample data setup
SELECT *
FROM   your_table
WHERE  to_date(mon||'/'||YEAR, 'mon/yyyy', 'nls_date_language = english') <= to_date(:dt, 'mon/yyyy', 'nls_date_language = english');

: dt = апр / 2018

      YEAR MON DT          ORG
---------- --- ----------- ---
      2018 mar 21/03/2018  bb2
      2018 mar 19/03/2018  bbd
      2018 feb 17/02/2018  bbc
      2018 feb 15/02/2018  bba
      2018 jan 15/01/2018  abb
      2018 jan 13/01/2018  abc

:дт = март / 2018

      YEAR MON DT          ORG
---------- --- ----------- ---
      2018 mar 21/03/2018  bb2
      2018 mar 19/03/2018  bbd
      2018 feb 17/02/2018  bbc
      2018 feb 15/02/2018  bba
      2018 jan 15/01/2018  abb
      2018 jan 13/01/2018  abc

: дт = февраль / 2018

      YEAR MON DT          ORG
---------- --- ----------- ---
      2018 feb 17/02/2018  bbc
      2018 feb 15/02/2018  bba
      2018 jan 15/01/2018  abb
      2018 jan 13/01/2018  abc

: дт = январь / 2018

      YEAR MON DT          ORG
---------- --- ----------- ---
      2018 jan 15/01/2018  abb
      2018 jan 13/01/2018  abc

: дт = декабрь / 2017

no rows selected

Вам необходимо соответствующим образом изменить ввод;в своем запросе я предположил, что запрашиваемый месяц будет в формате mon/yyyy;это может или не может иметь место.

Кроме того, поскольку мы используем mon, я добавил третий необязательный параметр, чтобы убедиться, что мы запрашиваем правильный язык дат.Запрос не сработал бы, если бы язык клиента был французским, но язык данных - английский!

Наконец, это похоже на плохой дизайн.Вы можете легко изменить эту таблицу, чтобы иметь только столбец dt, и добавить виртуальные столбцы в таблицу для создания столбцов месяца и года (хотя я бы не разделял их; я просто сделал бы trunc(dt, 'mm') и оставил бы его какдополнительный столбец даты. Более гибкий, IMO) и индексируйте виртуальный столбец (столбцы) соответственно.

0 голосов
/ 23 октября 2018

Чтобы получить самую последнюю дату для каждого месяца / года в таблице, вы можете использовать max с group by следующим образом (имя таблицы не было задано, назовем ее myTable):

SELECT year, mon, max(date) FROM myTable GROUP BY year, mon

Затем получение повторных данных можно выполнить с помощью объединения:

SELECT m2.year, m2.mon, m.date, m.org
FROM myTable AS m
    INNER JOIN (SELECT year, mon, max(date) AS maxDate FROM myTable GROUP BY year, mon) AS m2
        ON m.date <= m2.maxDate
ORDER BY m2.maxDate DESC, m.date DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...