Oracle - различается по группам по дате - PullRequest
1 голос
/ 18 июня 2019

У меня есть такая таблица в базе данных Oracle 11g

TABLE REC
REC_ID NUMBER
CARD_ID NUMBER
REC_STATUS NUMBER
REC_DATE TIMESTAMP

Я хочу знать, сколько карт было пополнено за определенный период, но я хочу, чтобы эта информация была сгруппирована по дате.Если card_id уже был подсчитан в одну дату, он не должен учитываться в другую следующую (отдельную).

Вот некоторые тестовые данные

with
     REC ( REC_ID, CARD_ID, REC_STATUS, REC_DATE ) as (
       select '1', '100', '1', SYSTIMESTAMP - 5 from dual union all
       select '2', '100', '1', SYSTIMESTAMP - 5  from dual union all
       select '3', '200', '1', SYSTIMESTAMP - 5  from dual union all
       select '4', '100', '1', SYSTIMESTAMP - 4  from dual union all
       select '5', '300', '1', SYSTIMESTAMP - 4  from dual union all
       select '6', '200', '1', SYSTIMESTAMP - 4  from dual union all
       select '7', '100', '1', SYSTIMESTAMP - 3  from dual union all
       select '8', '400', '1', SYSTIMESTAMP - 3  from dual union all
       select '9', '400', '1', SYSTIMESTAMP - 3  from dual union all
       select '10', '400', '1', SYSTIMESTAMP - 2  from dual union all
       select '11', '300', '1', SYSTIMESTAMP - 2  from dual union all
       select '12', '100', '1', SYSTIMESTAMP - 2  from dual union all
       select '13', '400', '1', SYSTIMESTAMP - 2  from dual 
     )
-- end of test data

Когда я выполняю запрос, подобный этому,у меня есть общее количество 4, что является правильным.

SELECT  
    COUNT(DISTINCT CARD_ID) COUNT 
FROM REC 
WHERE REC_STATUS = 1

Результат

|COUNT|
|   4 |

Но, когда я пытаюсь таким образом, я имею общее количество 10. Это потому, чтокогда я использую «сгруппировать» в дату и использую «отличный» в идентификаторе, различие будет работать только для сгруппированной даты, а не для всего периода.

SELECT  
    TRUNC(REC_DATE) DAT, 
    COUNT(DISTINCT CARD_ID) COUNT
FROM REC 
WHERE REC_STATUS = 1
GROUP BY TRUNC(REC_DATE)

Результат

DAT      | COUNT
14/06/19 |   2
13/06/19 |   3
15/06/19 |   3
12/06/19 |   2

Что я могу сделать, чтобы применить отличительное к общему периоду и при этом сохранить группировку по дате?

1 Ответ

0 голосов
/ 18 июня 2019

Возможно, вам просто нужна самая ранняя дата для каждой карты:

SELECT TRUNC(MIN_REC_DATE) as DAT, 
        COUNT(*) as COUNT
FROM (SELECT CARD_ID, MIN(REC_DATE) as MIN_REC_DATE
      FROM REC
      WHERE REC_STATUS = 1 
      GROUP BY CARD_ID
     ) R
GROUP BY TRUNC(MIN_REC_DATE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...