获取每组只有 1 条记录的记录
Posted
技术标签:
【中文标题】获取每组只有 1 条记录的记录【英文标题】:get records that have only 1 record per group 【发布时间】:2019-06-12 10:22:04 【问题描述】:我们的考勤数据库数据如下(sql server)
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 月 1 日)?
查询应该简单地列出一天中只有一种类型的员工的所有记录。
编辑
结果集应该更具体一点:显示所有日期只有“In”但没有“Out”的员工
【问题讨论】:
到目前为止你尝试过什么?为什么您尝试的方法不起作用?你有没有得到一个错误,意外的结果?如果你还没有尝试过,为什么不呢?当您搜索解决方案时,您对所阅读的文章/文档/示例有哪些不了解的地方? @Larnu 你是对的..... @Larnu 我曾想过尝试 group by 并拥有,但这无助于确定“显示员工仅在哪个日期签出而不是在哪个日期签出的记录”的要求 【参考方案1】:使用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
【讨论】:
请记住,第二个查询可以并且将选择 empid 和 date 列上的“重复”记录 谢谢你的回答,但是它可以处理只显示有Out但没有In的记录的情况【参考方案2】:你可以使用窗口函数:
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;
【讨论】:
【参考方案3】:使用相关子查询
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
【讨论】:
【参考方案4】:解决方法很简单,你可以使用'DISTINCT'函数。 查询应该是,
SELECT DISTINCT empid FROM attendance
这将在每个员工的每个日期仅返回 1 条记录。
供您参考,请查看-https://www.techonthenet.com/sql_server/distinct.php
【讨论】:
也许您应该阅读有关 formatting 选项的信息,因为您是新来的,所以可以在此网站上使用。 但是这个答案是错误的,因为它也会选择拥有不止一个记录的 empid.. 您的答案将返回所有员工,而 OP 正在寻找仅返回 emp#2 的解决方案。【参考方案5】:如果我们的 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)
【讨论】:
以上是关于获取每组只有 1 条记录的记录的主要内容,如果未能解决你的问题,请参考以下文章