Подсчитать количество повторяющихся строк - PullRequest
0 голосов
/ 21 января 2020

У меня есть таблица ниже

Таблица A:

row_number  id    start_dt    end_dt   cust_dt    cust_id
   1        101    4/8/19     4/20/19   4/10/19   725
   2        101    4/21/19    5/20/19   4/10/19   456
   3        101    5/1/19     6/30/19   4/10/19   725
   4        101    7/1/19     8/20/19   4/10/19   725

Мне нужно подсчитать "дубликаты" в таблице для целей тестирования.

Критерии: необходимо исключить start_dt и end_dt из моего расчета. Это только дубликат, если строка lead дублируется. Так, например, строка 1, строка 3 или 4 одинаковы, но только строки 3 и 4 будут считаться дубликатами в этом примере.

То, что я пробовал: rank с lead и самостоятельным соединением, но, похоже, это не работает для меня.

Как подсчитать идентификатор, чтобы определить, есть ли дубликаты?

Вывод: (что-то вроде ниже)

count    id 
  2      101

Конечным результатом для меня является подсчет 1 для стола

count  id
 1     101

Ответы [ 2 ]

2 голосов
/ 21 января 2020

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

Select count(1), id from
(Select t.*, 
        row_number() over (order by row_number) as rn,
        row_number() over (partition by id, cust_dt, cust_id order by row_number) as part_rn
   From your_table t)
Group by id, cust_dt, cust_id, (rn-part_rn)
Having count(1) > 1

db <> fiddle demo

Cheers !!

1 голос
/ 21 января 2020

Если ваше определение дублированной строки: CUST_ID в строке lead (с тем же порядком id на row_number), равным текущему CUST_ID,

Вы можете записать это просто, используя функцию LEAD analyti c.

select ID, ROW_NUMBER, CUST_ID,
case when CUST_ID = lead(CUST_ID) over (partition by id order by ROW_NUMBER) then 1 end is_dup
from tab

        ID ROW_NUMBER    CUST_ID     IS_DUP
---------- ---------- ---------- ----------
       101          1        725           
       101          2        456           
       101          3        725          1
       101          4        725       

Агрегированный запрос для получения количества дублированных строк будет, чем

with dup as (
select ID, ROW_NUMBER, CUST_ID,
case when CUST_ID = lead(CUST_ID) over (partition by id order by ROW_NUMBER) then 1 end is_dup
from tab)
select ID, sum(is_dup) dup_cnt
from dup
group by ID

        ID    DUP_CNT
---------- ----------
       101          1
...