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

Я хотел бы создать запрос, который проверяет, есть ли дублированный идентификатор, который использовался на дату.

С этой целью, за 60 дней до, а не после базовой даты, должны быть рассмотрены на предмет дублирования.Пример таблицы приведен ниже.

CREATE TABLE SampleTable (
   pKey INT PRIMARY KEY,
   personalID INT NOT NULL,
   createDate DATETIME NOT NULL,
   value INT NULL
);

Базовая дата соответствует DATE(createDate), тогда как идентификатор для проверки на дублирование равен personallD.Информация, необходимая здесь, может сводиться к количеству сегодняшних данных и дублированных данных.Количество сегодняшних данных можно легко запросить следующим образом.

SELECT
   COUNT(*)
FROM SampleTable
WHERE
   DATE(createDate) = DATE(NOW())

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

SELECT
   COUNT(*)
FROM (
   SELECT
      personalID,
      COUNT(*)
   FROM SampleTable
   WHERE
      DATEDIFF(NOW(), trDate) <= 60
   GROUP BY personalID HAVING COUNT(*) > 1
) AS T

В заключение все, что мне нужно сделать, это получить числоитоговые данные по дате и количеству данных, которые имели одинаковые значения personalID за предыдущие дни.

[Пример данных]

pKey    personalID  createDate  value
1       1           2018-01-01  100
2       2           2018-01-01  300
3       3           2018-01-01  500
7       1           2018-01-02  100
8       2           2018-01-02  200
9       3           2018-01-02  200
10      4           2018-01-02  100
11      5           2018-01-02  100
12      3           2018-01-03  200
13      4           2018-01-03  100
14      5           2018-01-03  100
15      6           2018-01-03  50

[Желаемый результат]

date        totalCount  duplicated
2018-01-01  3           0
2018-01-02  5           3
2018-01-03  4           3

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Вы также можете использовать метод самостоятельного объединения, чтобы выяснить этот тип данных.Если вам нужно выяснить, какой идентификатор повторяется, сравнивая с предыдущими датами, вы также можете использовать этот подход.

Create table Testtbl (pkey int, personalID int, createddate date, value int); 

insert into Testtbl values 
(1  ,     1,           '2018-01-01' , 100) , 
(2 ,     2,           '2018-01-01' , 300) ,
(3  ,     3,           '2018-01-01' , 500) ,
(4  ,     1,           '2018-01-02' , 100) ,
(5  ,     2,           '2018-01-02' , 200) ,
(6  ,     3,           '2018-01-02' , 200) ,
(7  ,     4,           '2018-01-02' , 100) ,
(8  ,     5,           '2018-01-02' , 100) ,
(9  ,     3,           '2018-01-03' , 200) ,
(14  ,     3,           '2018-01-03' , 500) ,
(10  ,     4,           '2018-01-03' , 100) ,
(11  ,     5,           '2018-01-03' , 100) ,
(12  ,     6,           '2018-01-03' , 50),
(13  ,     6,           '2018-01-03' , 100)

Запрос: левое объединение поможет найти дублированные данные без потери общего количества.Необходимо убедиться, что один и тот же идентификатор не учитывается дважды.

  select  t.createddate, count(Distinct t.pkey) TotalCount, 
  case when t.Createddate > t1.createddate  
  then Count(distinct t1.PersonalID) + case when t.Createddate = 
  t1.createddate and 
  t.personalID = t1.personalID  and t.pkey != t1.pkey then Count(distinct 
  t1.PersonalID) 
  else 0 end else 0     
  end   Duplicated   from Testtbl t 
  left join Testtbl t1 on t.personalID = t1.personalID 
                    and t.Createddate >= t1.Createddate and t.pkey != t1.pkey 
                    and DATEDIFF(t1.Createddate, t.Createddate) <= 60 
 Group by t.createddate

Вывод:

createddate  TotalCount Duplicated
2018-01-01     3         0
2018-01-02     5         3
2018-01-03     6         5
0 голосов
/ 31 декабря 2018

Если вы хотите, чтобы идентификаторы, имеющие несколько строк за последние 60 дней:

select personid
from sampledata
where trdate >= curdate() - interval 60 day
group by personid
having count(*) >= 2;

Если вы также хотите настаивать на том, чтобы personid появлялось в самую последнюю дату:

select personid
from sampledata
where trdate >= curdate() - interval 60 day
group by personid
having count(*) >= 2 and date(max(trdate)) = curdate();

РЕДАКТИРОВАТЬ:

Кажется, это то, что вы хотите, при условии отсутствия дубликатов в данный день

select trdate, count(*) as num_persons,
       sum(num_dups > 0) as num_dups
from (select sd.*,
             (select count(*)
              from sampledata sd2
              where sd2.personid = sd.personid and
                    sd2.trdate < sd.trdate and
                    sd2.trdate >= sd.trdate - interval 60 day
             ) as num_dups
      from sampledata
     ) sd
group by trdate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...