2015-03-05 2 views
0

Я работаю над SQL-запросом, который учитывает повторяющиеся записи, основанные на текстовом поле, с которым я работаю: где datasource = 'Web' или 'Internal'. В настоящее время я использую оператор case, чтобы подсчитать количество раз, когда запись показывает это значение. Мой вопрос: как мне вернуть значения (я думаю, оператор case с индикатором (1 или 0)), который показывает, где datasource = 'Web' и date> datasource = 'Internal' и date?SQL: Flag Duplicate Records using Case Statement WHERE FIELD VALUE1 <> FIELD VALUE 2 & FIELD VALUE1 DATE> FIELD VALUE2

Дата web.datasource> Дата internal.datasource

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

SELECT id 
,lastname 
,firstname 
,datasource 
,CASE 
WHEN (
    (Datasource = 'Web') 
    )THEN Count(Datasource) 
ELSE 0 
    END WebData 
,CASE 
WHEN (
    (Datasource = 'Internal') 
    ) THEN Count(Datasource) 
ELSE 0 
    END InternalData 
,count(id) as countid 
,date 

FROM Table 


GROUP BY 
id 
,lastname 
,firstname 
,datasource 
,date 

Это в настоящее время возвращается:

12345 Jack Boss Internal 0 1 1 2015-03-25 
12241 Eric Graves Internal 0 1 1 2015-04-01 
13300 Su  Lynn Web   1 0 1 2016-02-01 
13300 Su  Lynn Internal 0 1 1 2015-08-07 
13914 Mark Ross Internal 0 2 2 2015-05-01 
14008 Mitch Smith Web   1 0 1 2016-03-07 
14008 Mitch Smith Internal 0 1 1 2015-06-02 

Это то, что я хотел бы конечный результат выглядеть следующим образом:

12345 Jack Boss Internal 0 1 1 2015-03-25 0 
12241 Eric Graves Internal 0 1 1 2015-04-01 0 
13300 Su  Lynn Web   1 0 1 2016-02-01 0 
13300 Su  Lynn Internal 0 1 1 2015-08-07 0 
13914 Mark Ross Internal 0 2 2 2015-05-01 0 
14008 Mitch Smith Web   1 0 1 2016-03-07 1 
14008 Mitch Smith Internal 0 1 1 2015-06-02 1 

ИЛИ

14008 Mitch Smith 1 1 2 

идеи? Благодарю.

+0

Я не понимаю, почему это '0' для всех, кроме двух последних записей в вашем примере, не могли бы вы объяснить это? Возможно, вам поможет расширение ваших данных образца, чтобы показать дубликаты. Кроме того, какую базу данных вы используете? –

+0

Учитывая, что вы ссылаетесь на столбец 'datasource', вы используете' union' для получения всех данных в один результирующий набор? –

+0

Я просто поставил 0,1 в качестве индикатора. Может быть правдой, ложной или любой другой. 1 Указывает, что в веб-записи есть дата больше внутренней записи – user4637035

ответ

0

Это может заставить вас начать:

SELECT id 
,lastname 
,firstname 
,datasource 
,CASE 
WHEN (
    (Datasource = 'Web') 
    )THEN Count(Datasource) 
ELSE 0 
    END WebData 
,CASE 
WHEN (
    (Datasource = 'Internal') 
    ) THEN Count(Datasource) 
ELSE 0 
    END InternalData 
,count(id) as countid 
,date 
, sub_table.an_indicator 

FROM Table 
, ( select t2.id as id 
,    case when h_table.web_date > h_table.internal_date 
       then 1 
       else 0 end as an_indicator 
     from(select t2.id as id 
       ,  max(date) as web_date 
       ,  null as internal_date 
       from table t2 
       where t2.id=Table.id 
       and t2.lastname = Table.lastname 
       and t2.firstname = Table.firstname 
       and t2.datasource = 'Web' 
       group by t2.id 
       union 
       select t2.id 
       ,  null 
       ,  max(date) 
       from table t2 
       where t2.id=Table.id 
       and t2.lastname = Table.lastname 
       and t2.firstname = Table.firstname 
       and t2.datasource = 'Internal' 
       group by t2.id 
      ) h_table  
    ) sub_table 
where sub_table.id = Table.id 
+0

Это хорошая отправная точка, но мне удается получить ошибку в объединении, который я не могу понять, почему я получаю ...? Логически глядя на запрос, это имеет смысл. Не совсем уверен, что моя проблема ... – user4637035

+0

Попробуйте оставить отличную ... Просто союз. Просто убедитесь, что вы не используете союз. – avk

0
select 
    id, lastname, firstname, datasource 
    case when Datasource = 'Web' then count(Datasource) else 0 end as WebData, 
    case when Datasource = 'Internal' then count(Datasource) else 0 end as InternalData, 
    count(id) as CountId, 
    "date", 
    min(dups.flag) as dup 
from 
    <table> as t 
    inner join 
    (
     select 
      id, lastname, firstname, 
      case 
       when max(case when datasource = 'web' then "date" end) > 
        max(case when datasource = 'internal' then "date" end) 
       then 1 else 0 
      end as flag 
     from <table> 
     group by 
      id, lastname, firstname 
    ) as dups 
     on  dups.id = t.id 
      and dups.lastname = t.lastname and dups.firstname = t.firstname 
group by 
    id, lastname, firstname, datasource 

Любой шанс это один может работать?

select 
    id, lastname, firstname, datasource 
    case when Datasource = 'Web' then count(Datasource) else 0 end as WebData, 
    case when Datasource = 'Internal' then count(Datasource) else 0 end as InternalData, 
    count(id) as CountId, 
    "date", 
    case when max(case when datasource = 'web'  then "date" end) 
        over (partition by id, lastname, firstname) > 
       max(case when datasource = 'internal' then "date" end) 
        over (partition by id, lastname, firstname) 
     then 1 
     else 0 
    end as dup 
from 
    <table> as t 
group by 
    id, lastname, firstname, datasource