获取每组只有 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 条记录的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中获取每组的最后一条记录

获取每组分组结果的前 n 条记录

获取每组分组结果的前 n 条记录

node.js oracledb - 使用数组为每组获取一条记录

MySQL快速检索每组中的最后一条记录

mysql表里数据分类,分类后显示每组分类里面第一条记录