Сгруппировать и выбрать Различить в SQL Server - PullRequest
0 голосов
/ 09 ноября 2019

Каковы различия между следующими двумя запросами?

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

против

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

Второй дал мне меньше строк, чем первый.

Ответы [ 3 ]

2 голосов
/ 09 ноября 2019

Вас смущают скобки в первом запросе. Они ничего не делают, поэтому запишите запрос следующим образом:

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 не возвращается, поскольку он появляется дважды.

0 голосов
/ 09 ноября 2019

Запросы имеют аналогичное намерение, чтобы получить invalid_emails по lead_id.

2-й запрос использует агрегатные функции, чтобы вернуть только максимальный приводит_id, и использует предложение has для удаления дубликатов.

0 голосов
/ 09 ноября 2019

В первом запросе

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, появляется в первом запросе и фильтруется по group by в следующем запросе

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