при попытке показать даты значений MIN и MAX каждого клиента в БД BROWSER для SQLITE - PullRequest
0 голосов
/ 03 мая 2020
+----------------------------------+
| CUST_NO,YEAR_MONTH,TOTAL_DEPOSIT |
+----------------------------------+
| 1,201912,802452                  |
| 1,201911,30                      |
| 1,201910,370071                  |
| 2,201912,33                      |
| 2,201911,0                       |
| 2,201910,89                      |
| 3,201912,2                       |
| 3,201911,926091                  |
| 3,201910,82                      |
+----------------------------------+

В этой таблице данных я пытаюсь вычислить даты значений MIN и MAX на SQLite

Вывод должен выглядеть следующим образом

╔═════════════════════════════════╗
║ CUST_NO,DATE_OF_MIN,DATE_OF_MAX ║
╠═════════════════════════════════╣
║ 1,201911,201912                 ║
║ 2,201911,201910                 ║
║ 3,201912,201911                 ║
╚═════════════════════════════════╝

Это то, что я сделал до сих пор ;

SELECT 
CUST_NO
,YEAR_MONTH
,MAX(TOTAL DEPOSIT) AS TOTAL_DEP_MAX
FROM XSELL_DATAMART 
GROUP BY CUST_NO

, чтобы я мог получить дату максимума, но каким-то образом мне нужно сохранить эту дату как DATE_OF_MAX и повторить ее для MIN и внутренне выбрать их или создать две отдельные таблицы и объединить их? вот где я застрял.

Ответы [ 3 ]

1 голос
/ 03 мая 2020

Я не уверен, но попробую.

Select mn.CUST_NO, YEAR_MONTH_MIN, YEAR_MONTH_MAX
From
(
SELECT 
    d.CUST_NO
    ,d.YEAR_MONTH as YEAR_MONTH_MIN
From XSELL_DATAMART d
Inner join
(
    SELECT 
         CUST_NO
        ,MIN(TOTAL_DEPOSIT) AS TOTAL_DEP_MIN
    FROM XSELL_DATAMART 
    GROUP BY CUST_NO
    ) n on d.CUST_NO = n.CUST_NO and d.TOTAL_DEPOSIT = n.TOTAL_DEP_MIN
) mn
Inner join 
(
SELECT 
    d.CUST_NO
    ,d.YEAR_MONTH as YEAR_MONTH_MAX
From XSELL_DATAMART d
Inner join
(
    SELECT 
         CUST_NO
        ,MAX(TOTAL_DEPOSIT) AS TOTAL_DEP_MAX
    FROM XSELL_DATAMART 
    GROUP BY CUST_NO
    ) n on d.CUST_NO = n.CUST_NO and d.TOTAL_DEPOSIT = n.TOTAL_DEP_MAX
)mx on mn.CUST_NO = mx.CUST_NO
}
1 голос
/ 03 мая 2020

Самый простой способ - использовать FIRST_VALUE() оконную функцию:

SELECT DISTINCT
  CUST_NO,
  FIRST_VALUE(YEAR_MONTH) OVER (PARTITION BY CUST_NO ORDER BY TOTAL_DEPOSIT) DATE_OF_MIN,
  FIRST_VALUE(YEAR_MONTH) OVER (PARTITION BY CUST_NO ORDER BY TOTAL_DEPOSIT DESC) DATE_OF_MAX
FROM XSELL_DATAMART

См. demo . Результаты:

| CUST_NO | DATE_OF_MIN | DATE_OF_MAX |
| ------- | ----------- | ----------- |
| 1       | 201911      | 201912      |
| 2       | 201911      | 201910      |
| 3       | 201912      | 201911      |
0 голосов
/ 03 мая 2020

Попробуйте, вот демоверсия .

 select
      CUST_NO,
      min(YEAR_MONTH) as DATE_OF_MAX,
      max(YEAR_MONTH) as DATE_OF_MIN
  from
  (
    select
      CUST_NO,
      YEAR_MONTH,
      row_number() over (partition by CUST_NO order by TOTAL_DEPOSIT desc) as hrnk,
      row_number() over (partition by CUST_NO order by TOTAL_DEPOSIT) as lrnk
    from myTable
  ) t
  where hrnk = 1 or lrnk = 1
  group by
    CUST_NO

Вывод:

| CUST_NO | DATE_OF_MAX | DATE_OF_MIN |
| ------- | ----------- | ----------- |
| 1       | 201911      | 201912      |
| 2       | 201910      | 201911      |
| 3       | 201911      | 201912      |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...