Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подсчёт разных клиентов по одной карте  [new]
elay13
Member

Откуда:
Сообщений: 37
Присутсвует следующая таблица:

CREATE TABLE #t (date_time date, client_id nvarchar(50), app_id nvarchar(50),card_number nvarchar(50));
INSERT INTO #t VALUES

('2021-01-01','A','1r111','1****1'),
('2022-02-02','A','2r222','1****1'),
('2023-03-03','B','3r333','1****1'),
('2024-04-04','C','4r444','1****1'),
('2025-05-05','B','5r555','1****1'),
('2026-06-06','B','6r666','1****1'),
('2027-07-07','B','7r777','1****1');

app_id - id заявки, всегда уникальное значение
client_id - id клиента, тянется за клиентом
сard_number - номер карты, в этой таблице все клиенты пользовались одной картой.

Подскажите, каким образом я могу создать запрос, который будет подсчитывать сколько разных клиентов пользовались картой, на момент заявки? Группировка должна быть по app_id.

Итог, который хотелось бы получить:

app_id client_count
1r111 1
2r222 1
3r333 2
4r444 3
5r555 3
6r666 3
7r777 3

Заранее спасибо!
10 июн 21, 16:08    [22333926]     Ответить | Цитировать Сообщить модератору
 Re: Подсчёт разных клиентов по одной карте  [new]
L_argo
Member

Откуда:
Сообщений: 1473
что-то типа

count(distinct client_id)
10 июн 21, 16:14    [22333927]     Ответить | Цитировать Сообщить модератору
 Re: Подсчёт разных клиентов по одной карте  [new]
court
Member

Откуда:
Сообщений: 2335
elay13,

так как-то
with cte as (
	select
		*
		,case when row_number()over(partition by client_id order by date_time)=1 then 1 else 0 end as xz
	from #t t
)
select 
	app_id
	,sum(xz)over(order by date_time) as xz
from cte

app_idxz
1r1111
2r2221
3r3332
4r4443
5r5553
6r6663
7r7773
10 июн 21, 18:10    [22333996]     Ответить | Цитировать Сообщить модератору
 Re: Подсчёт разных клиентов по одной карте  [new]
court
Member

Откуда:
Сообщений: 2335
даа, и карту, конечно, в partition нужно, если выборка по нескольким картам будет ...

with cte as (
	select
		*
		,case when row_number()over(partition by card_number, client_id order by date_time)=1 then 1 else 0 end as xz
	from #t t
)
select 
	*
	,sum(xz)over(partition by card_number order by date_time) as xz
from cte
10 июн 21, 18:18    [22334006]     Ответить | Цитировать Сообщить модератору
 Re: Подсчёт разных клиентов по одной карте  [new]
Кесарь
Member

Откуда:
Сообщений: 651
court,

всегда завидовал людям, которые умеют понимать ТЗ по столь малым предпосылкам!

Подскажите, каким образом я могу создать запрос, который будет подсчитывать сколько разных клиентов пользовались картой, на момент заявки? Группировка должна быть по app_id.

Вот что значит "на момент заявки"??? Что такое момент заявки? Где это объяснено?

Про то, что никак тоже не описано, как заявки связаны с клиентами, я даже уже и говорить не буду.
10 июн 21, 18:27    [22334023]     Ответить | Цитировать Сообщить модератору
 Re: Подсчёт разных клиентов по одной карте  [new]
elay13
Member

Откуда:
Сообщений: 37
court, Огромное спасибо!
11 июн 21, 10:36    [22334215]     Ответить | Цитировать Сообщить модератору
 Re: Подсчёт разных клиентов по одной карте  [new]
elay13
Member

Откуда:
Сообщений: 37
court, Огромное спасибо!
11 июн 21, 10:37    [22334219]     Ответить | Цитировать Сообщить модератору
 Re: Подсчёт разных клиентов по одной карте  [new]
elay13
Member

Откуда:
Сообщений: 37
court,
Пытался сделать вот таким способом , но жалуется на группировку

select t2.app_id, case when t1.client_id<>t2.client_id then count( distinct t1.client_id) end as mosh
from #t1 t1
left join #t1 t2
on t1.card_number=t2.card_number
and t1.date_time<t2.date_time
where t2.card_number is not null
group by t2.app_id
drop table #t1
11 июн 21, 10:56    [22334239]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить