получить записи, которые имеют только 1 запись на группу - PullRequest
0 голосов
/ 12 июня 2019

у нас есть данные о посещении базы данных следующим образом (сервер sql)

empid       date          type
1           01-Jan         In
1           01-Jan         Out
2           01-Jan         In
3           01-Jan         In
3           01-Jan         Out

Как мы можем получить записи, которые имеют только 1 запись на дату на одного сотрудника (в вышеупомянутом случае empid 2 для 01-января)?

Запрос должен просто перечислить все записи сотрудников, которые имеют только один тип за день.

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

Набор результатов должен быть немного большеконкретный: показать всех сотрудников, у которых есть только «В» на дату, но нет «Вне»

Ответы [ 5 ]

3 голосов
/ 12 июня 2019

Использование Having

select empid, date, count(*)
from Mytable
group by empid, date
having count(*) = 1

Вы можете использовать это, чтобы получить полную строку:

select t1.*
from MyTable t1
inner join 
(
    select empid, date, count(*)
    from Mytable
    group by empid, date
    having count(*) = 1
) t2
on t1.empid = t2.empid
and t1.date = t2.date
2 голосов
/ 12 июня 2019

Вы можете использовать оконные функции:

select t.*
from (select t.*,
             count(*) over (partition by empid, date) as cnt
      from t
     ) t
where cnt = 1;

Вы также можете использовать агрегацию:

select empid, date, max(type) as type
from t
group by empid, date
having count(*) = 1;
1 голос
/ 12 июня 2019

Используйте коррелированный подзапрос

select * from tablename a
where not exists (select 1 from tablename b where a.empid=b.empid and  a.date=b.date and type='Out')

ИЛИ

select empid, date,count(distinct type)
from tablename
group by empid,date
having count(distinct type)=1
0 голосов
/ 12 июня 2019

Это будет работать, если у нас есть ID с 1 IN И 1 OUT, а также

Declare @t table (empid int,date varchar(50),types varchar(50))

insert into @t values (1,'01-Jan','IN')
insert into @t values (1,'01-Jan','OUT')
insert into @t values (2,'01-Jan','IN')
insert into @t values (3,'01-Jan','OUT')
insert into @t values (4,'01-Jan','OUT')

select * from @t a
where not exists (select 1 from @t b where a.empid=b.empid and a.types!=b.types)
0 голосов
/ 12 июня 2019

Решение очень простое, вы можете использовать функцию «DISTINCT». Запрос должен быть как,

SELECT DISTINCT empid FROM attendance

Это вернет только 1 запись в день на сотрудника.

Для справки, проверьте- https://www.techonthenet.com/sql_server/distinct.php

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