SQL-запрос для выявления несоответствия - PullRequest
0 голосов
/ 07 июня 2018

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

Пример: Давайте возьмем таблицу "account"

Accountno.     Name.    Date
01.               A.            01/03/2018
01.               B.            01/03/2018
01.               C             01/03/2018

02.               A.            01/05/2018
02.               B.            01/05/2018
02.               C             01/03/2018 

Мой запрос должен выдавать выходные данные как учетная запись 02, потому что он имеет несоответствие дат для строк A, B, C и должен игнорировать учетную запись 01.

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

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Я бы просто сделал:

select ac.Accountno
from Account ac
group by ac.Accountno
having min(ac.date) <> max(ac.date);

Это стандартный SQL и должен работать в любой базе данных.

0 голосов
/ 07 июня 2018

Я бы пошел только с exists:

select t.*
from table t
where exists (select 1 
              from table t1 
              where t1.accountno = t.accountno and 
                    t1.Date <> t.Date
             );
0 голосов
/ 07 июня 2018

Поскольку OP не указан, СУБД, приведенная ниже, является простым примером, использующим только подзапрос и агрегирование.

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

(работает в T-SQL)

create table dbo.[Account]
(
    [Accountno] int not null,
    [Name] varchar(100) not null,
    [Date] date not null
)

GO

insert into dbo.[Account]
([Accountno], [Name], [Date])
values
 (01, 'A.',  '01/03/2018')
,(01, 'B.',  '01/03/2018')
,(01, 'C' ,  '01/03/2018')
,(02, 'A.',  '01/05/2018')
,(02, 'B.',  '01/05/2018')
,(02, 'C',   '01/03/2018')

GO

select x.Accountno
from
(
    select ac.Accountno, MAX(ac.Date) as lastDate, MIN(ac.Date) as firstDate
    from dbo.Account ac
    group by ac.Accountno
) as x
where x.firstDate != x.lastDate

Редактировать

То же самоезапрос написан для Oracle .Пример на скрипке http://sqlfiddle.com/#!4/e96181/8

select x.Accountno
from
(
    select ac.Accountno, MAX(ac.MyDate) as lastDate, MIN(ac.MyDate) as firstDate
    from Account ac
    group by ac.Accountno
) x
where x.firstDate != x.lastDate

(работает на Oracle 11g)

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