在SQL Server中分组并选择不同

时间:2019-11-09 04:20:26

标签: sql sql-server

以下两个查询之间有什么区别?

SELECT distinct(Invalid_Emails), [leads_id] 
FROM [dbo].[InvalidEmails_stg] 
ORDER BY LEADS_ID DESC

vs

select invalid_emails, max(leads_id) as id 
from invalidEmails_stg 
group by invalid_emails 
having count(*) < 2 
order by id desc

第二行给我的行少于第一行。

3 个答案:

答案 0 :(得分:2)

您对第一个查询中的括号感到困惑。他们什么也没做,所以将查询写为:

SELECT DISTINCT Invalid_Emails, leads_id 
FROM [dbo].[InvalidEmails_stg]
ORDER BY LEADS_ID DESC;

这将返回出现在数据库中的所有Invalid_Emails / Leads_id对。无论给定对出现多少次,都会在结果集中恰好出现一次。

此查询:

select invalid_emails, max(leads_id) as id 
from invalidEmails_stg 
group by invalid_emails 
having count(*) < 2 
order by id desc;

返回在数据中仅出现一次的invalid_emails / leads_id对。它将滤除出现多次的所有配对。

这是一个简单的例子:

invalid_emails   leads_id
    a@b.com         1
    a@b.com         1
    b@c.com         2
    b@c.com         3
    d@e.com         1

第一个查询将返回:

    a@b.com         1
    b@c.com         2
    b@c.com         3
    d@e.com         1

a@b.com仅返回一次,因为已删除重复项。

第二个将返回:

    b@c.com         2
    b@c.com         3
    d@e.com         1

a@b.com未返回,因为它出现了两次。

答案 1 :(得分:1)

第一次查询

public ngOnInit() {
  this.hero$ = this.store.pipe(select(getSelectedHero));
}

您没有检查约束SELECT distinct(Invalid_Emails),[leads_id] FROM [dbo].[InvalidEmails_stg] ORDER BY LEADS_ID DESC

实际上在第二次查询中:

< 2

如果结果包含两行或多于select invalid_emails, max(leads_id) as id from invalidEmails_stg group by invalid_emails having count(*)<2 order by id desc 行,则过滤您的结果。

另一个差异是Having Count(*)值。如果在第一个查询中显示具有NULL值的Invalid_Emails列,并在下一个查询中按Null过滤

答案 2 :(得分:0)

查询具有类似的意图,目的是通过Leads_id获取无效的电子邮件。

第二个查询使用聚合函数仅返回最大Leads_id,并使用hading子句删除重复项。