Sql 使用计数/分组依据时需要选择所有列
我有一个表,其中一列有一些重复记录 我的任务是选择具有所有属性的重复记录 都柏林城邦客户FN DOB有一些重复值,我需要从整个表中选择这些值,并列出DOB字段中所有相同记录的所有列 我的尝试Sql 使用计数/分组依据时需要选择所有列,sql,sql-server,database,group-by,Sql,Sql Server,Database,Group By,我有一个表,其中一列有一些重复记录 我的任务是选择具有所有属性的重复记录 都柏林城邦客户FN DOB有一些重复值,我需要从整个表中选择这些值,并列出DOB字段中所有相同记录的所有列 我的尝试 Select DOB, COUNT(DOB) As 'SameDOB' from Table1 group by DOB HAVING (COUNT(DOB) > 1) 这只返回两列和一行。第一列是多次出现的DOB列,第二列给出计数 我需要找出一种方法来列出所有属性,而不仅仅是这两个 请指导我
Select DOB, COUNT(DOB) As 'SameDOB' from Table1
group by DOB
HAVING (COUNT(DOB) > 1)
这只返回两列和一行。第一列是多次出现的DOB列,第二列给出计数
我需要找出一种方法来列出所有属性,而不仅仅是这两个
请指导我正确的方向。尝试加入子查询,这也将允许您查看计数
Select *
FROM Table1 T
WHERE T.DOB IN( Select I.DOB
FROM Table1 I
GROUP BY I.DOB
HAVING COUNT(I.DOB) > 1)
select t.*, a.SameDOB from Table1 t
join (
Select DOB, COUNT(DOB) As 'SameDOB' from Table1
group by DOB
HAVING (COUNT(DOB) > 1)
) a on a.dob = t.dob
我认为更通用的解决方案是使用windows功能:
select *
from (select *, count(*) over (partition by dob) as NumDOB
from table
) t
where numDOB > 1
更一般的原因是,很容易在两列或多列中更改为重复项。您只需在
选择中列出它们,不要忘记将它们包含在分组中。我错过什么了吗?你试过了吗?它没有给你你期望的结果?@Paveleller-通常,是的,group by可以工作,但是当你试图查找重复项时,group by对所有字段只会查找不同行的计数,因此计数必须放在子查询或CTE中。对子查询使用'IN'子句可能会非常慢,仅供参考。@ChrisGessler。修复了from的问题,但我不确定
中的是否较慢。LOL-按dob从dob组中选择dob,按dob进行dob排序。。。。但是是的,众所周知IN子句比joins慢@克里斯盖斯勒。比按狗从狗组中选择狗更好…
@ChrisGessler。我读过那篇帖子,我不知道那家伙看起来一点都不是专家。阅读他的博客上的评论,读者教他EXIST
。这是什么???啊…这很有效。说到子查询,我还是个新手。我想我需要在接下来的日子里集中精力解决这个问题。我需要找一本书详细介绍这一点。@JohnSmith-MSDN在你有空闲的时候是一本很好的读物。现在,另一部分是,找到最年轻的客户并列出所有有该DOB的客户。换句话说,我将在实体中至少有一条具有所有属性的记录……从Customers Group by DateOfBirth Order by DateOfBirth descNow中选择top(1)DateOfBirth,COUNT(DateOfBirth)作为“最年轻的客户”,这给了我两列。一个有最小客户的DOB,另一个有最小客户的计数。然后我需要列出最年轻的客户信息(其他属性)…因为我只有一个客户具有该dob,所以我将有一行。但我很难弄明白这一点…我要试试这个子查询格式,看看能得到什么。我还需要了解一件事…分区。谢谢…今晚学习了很多。请给出你的代码和正确的解释。只有代码的答案不受欢迎。
select *
from table1, (select count(*) from table1) as cnt