COUNT DISTINCT WITH CONDITION и GROUP BY - PullRequest
2 голосов
/ 10 июля 2020

Я хочу подсчитать количество отдельных элементов в столбце при определенных условиях. Например, если таблица выглядит так:

ID | name   |    date    | status
---+--------+------------+--------
1  | Andrew | 2020-04-12 | true
2  | John   | 2020-03-22 | null
3  | Mary   | 2020-04-13 | null
4  | John   | 2020-05-27 | false
5  | Mary   | 2020-02-08 | true
6  | Andrew | 2020-02-08 | null

Если я хочу подсчитать количество различных имен как «количество имен», где статус последней даты не равен нулю, и сгруппировать их по статусу, что мне следует делать?

Результат должен быть:

status | name_count
-------+-----------
true   | 1            ---> Only counts Andrew (ID 1 has the last date)
false  | 1            ---> Only counts John (ID 4 has the last date)  

Ответы [ 3 ]

2 голосов
/ 10 июля 2020

Вы можете попробовать с помощью запроса ниже

SELECT COUNT(DISTINCT Name), Status 
  FROM Table
  WHERE Status IS NOT NULL
 GROUP BY Status;
2 голосов
/ 10 июля 2020

Вы можете попробовать использовать row_number()

select status,count(distinct name) as cnt from 
(
select name,date,status,row_number() over(partition by name order by date desc) as rn
from tablename
)A where rn=1 and status is not null
group by status
0 голосов
/ 10 июля 2020
SELECT status,COUNT(*) AS name_count 
FROM (SELECT DISTINCT status,name FROM TEMP WHERE status IS NOT NULL) 
GROUP BY status;

Это должно сработать, но должно ли name_count из true быть 2, поскольку и Эндрю, и Мэри имеют статус как true? По крайней мере, вот мой ответ после того, как я запустил свою команду

status | name_count
-------+-----------
false   | 1           
true  | 2         

Дайте мне знать, если у вас есть какие-либо сомнения в том, как работает команда

...