Oracle запрос, чтобы узнать, был ли аккаунт отрицательным в течение нескольких дней - PullRequest
1 голос
/ 01 апреля 2020

У меня есть таблица с ежедневным балансом для счетов. Нужно знать, как я могу найти все аккаунты, которые были отрицательными в течение более чем определенного числа дней.

Пример данных -

Accountid Date         Balance 
1000      01/01/2020   -1.00
1000      01/02/2020   -1.00
1000      01/03/2020   -1.00
1001      01/01/2020   -20.00
1001      01/02/2020   -20.00
1003      01/01/2020    15.00
1003      01/02/2020    16.00

Мне нужно запросить все учетные записи, которые были отрицательными в течение более 2 дней

Ответы [ 5 ]

1 голос
/ 01 апреля 2020

Вы можете запросить дни с отрицательным сальдо, сгруппировать по идентификатору счета, а затем посчитать, сколько строк вы получили в предложении having:

SELECT   AccountID
FROM     mytable
WHERE    balance < 0
GROUP BY AccountID
HAVING   COUNT(*) >= 2
0 голосов
/ 02 апреля 2020

Если вы хотите учитывать только последовательные дни, то:

SELECT AccountId
FROM   (
  SELECT Accountid, DateTime, Balance,
         SUM( has_changed_sign )
           OVER ( PARTITION BY AccountId ORDER BY DateTime )
           AS grp
  FROM   (
    SELECT Accountid, DateTime, Balance,
           CASE
           WHEN SIGN( balance )
                = LAG( SIGN( Balance ) )
                    OVER ( PARTITION BY AccountId ORDER BY DateTime )
           THEN 0
           ELSE 1
           END AS has_changed_sign
    FROM   table_name t
  )
  WHERE Balance < 0
)
GROUP BY AccountID, grp
HAVING COUNT(*) > 2

Итак, для тестовых данных:

CREATE TABLE table_name ( Accountid, DateTime, Balance ) AS 
SELECT 1000, DATE '2020-01-01',  -1.00 FROM DUAL UNION ALL -- 3 consecutive -ve days
SELECT 1000, DATE '2020-01-02',  -1.00 FROM DUAL UNION ALL
SELECT 1000, DATE '2020-01-03',  -1.00 FROM DUAL UNION ALL
SELECT 1000, DATE '2020-01-04',  +1.00 FROM DUAL UNION ALL
SELECT 1001, DATE '2020-01-01', -20.00 FROM DUAL UNION ALL -- Only 2 negative
SELECT 1001, DATE '2020-01-02', -20.00 FROM DUAL UNION ALL
SELECT 1001, DATE '2020-01-03', +20.00 FROM DUAL UNION ALL
SELECT 1001, DATE '2020-01-04', +20.00 FROM DUAL UNION ALL
SELECT 1002, DATE '2020-01-01',  -1.00 FROM DUAL UNION ALL -- 3 negative days but
SELECT 1002, DATE '2020-01-02',  -1.00 FROM DUAL UNION ALL -- only 2 consecutive
SELECT 1002, DATE '2020-01-03',  +1.00 FROM DUAL UNION ALL
SELECT 1002, DATE '2020-01-04',  -1.00 FROM DUAL UNION ALL
SELECT 1003, DATE '2020-01-01', +15.00 FROM DUAL UNION ALL -- All positive
SELECT 1003, DATE '2020-01-02', +16.00 FROM DUAL UNION ALL
SELECT 1003, DATE '2020-01-03', +17.00 FROM DUAL UNION ALL
SELECT 1003, DATE '2020-01-04', +18.00 FROM DUAL;

Это выводит:

| ACCOUNTID |
| --------: |
|      1000 |

Если вам нужно больше, чем 2 дня, тогда вы можете просто использовать LAG:

SELECT DISTINCT
       AccountID
FROM (
  SELECT AccountID,
         balance,
         LAG( balance, 1 ) OVER ( PARTITION BY AccountID ORDER BY DateTime )
           AS balance_1_day_ago,
         LAG( balance, 2 ) OVER ( PARTITION BY AccountID ORDER BY DateTime )
           AS balance_2_days_ago
  FROM   table_name
)
WHERE  balance < 0
AND    balance_1_day_ago < 0
AND    balance_2_days_ago < 0;

Но это не будет хорошо масштабироваться, если вы хотите проверить больший период поскольку запрос быстро станет очень большим.

db <> fiddle здесь

0 голосов
/ 01 апреля 2020

Если вы хотите, чтобы все столбцы, то используйте раздел по. Приведенное ниже решение также будет учитывать порядок дат

    Select Accountid, Date,  Balance, 
    row_number() over (Partition by 
     Accountid order by Date) 
   rn from table
   Where balance<0 and rn>2 ;
0 голосов
/ 01 апреля 2020

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

SELECT accountid
       FROM elbat
       WHERE balance < 0
       GROUP BY accountid
       HAVING count(DISTINCT date) > 2;
0 голосов
/ 01 апреля 2020

Попробуйте это.

Выберите accountid, count (date) из таблицы, где баланс <0 Сгруппировать по accountid Имея count (date)> 2

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