I want to do a limit count or be able to find how many times a user has interacted with a site with a cap. So if the amount of users reached a cap to give the maximum amount and if only a certain amount of users have visited that is under the cap i want to know that number as well with the date limiting on the 4th of January.
USERINSTANCE
UserID | Instance | CapID | date |
---|---|---|---|
1 | row | 1 | 01/02/2022 |
2 | row | 1 | 01/02/2022 |
3 | row | 1 | 01/02/2022 |
4 | row | 1 | 01/02/2022 |
5 | row | 1 | 01/02/2022 |
1 | row | 2 | 01/02/2022 |
6 | row | 1 | 01/02/2022 |
2 | row | 2 | 01/02/2022 |
7 | row | 1 | 01/02/2022 |
8 | row | 1 | 01/02/2022 |
9 | row | 1 | 01/03/2022 |
10 | row | 1 | 01/03/2022 |
11 | row | 1 | 01/02/2022 |
12 | row | 1 | 01/02/2022 |
13 | row | 1 | 01/03/2022 |
3 | row | 2 | 01/03/2022 |
4 | row | 2 | 01/03/2022 |
5 | row | 2 | 01/04/2022 |
6 | row | 2 | 01/04/2022 |
14 | row | 1 | 01/04/2022 |
CAPLIMIT
LimitCap | capID | tracker |
---|---|---|
10 | 1 | sales |
5 | 2 | invite |
Desired results:
Tracker | LimitCap | ActualCount | TotalCount |
---|---|---|---|
Sales | 10 | 10 | 14 |
Invite | 5 | 4 | 6 |
CodePudding user response:
Try something like this:
SELECT c.tracker, c.LimitCap, LEAST(SUM(IFF(date < '01/04/2022'::date, 1, 0)), c.LimitCap) AS ActualCount, COUNT(Instance) AS TotalCount
FROM USERINSTANCE AS u
JOIN CAPLIMIT AS c ON u.CapID = c.CapID
GROUP BY c.tracker, c.LimitCap;
CodePudding user response:
So Michael has shown how to do a logical count via SUM & IFF, and then use LEAST to doing the capping.
There is also the inbuild function COUNT_IF that is even more tidy to do this:
Thus with some CTE's for data:
with USERINSTANCE(UserID, Instance, CapID, date) as (
select column1, column2, column3, to_date(column4, 'mm/dd/yyyy') from values
(1 ,'row' ,1, '01/02/2022'),
(2 ,'row' ,1, '01/02/2022'),
(3 ,'row' ,1, '01/02/2022'),
(4 ,'row' ,1, '01/02/2022'),
(5 ,'row' ,1, '01/02/2022'),
(1 ,'row' ,2, '01/02/2022'),
(6 ,'row' ,1, '01/02/2022'),
(2 ,'row' ,2, '01/02/2022'),
(7 ,'row' ,1, '01/02/2022'),
(8 ,'row' ,1, '01/02/2022'),
(9 ,'row', 1, '01/03/2022'),
(10,'row', 1, '01/03/2022'),
(11,'row', 1, '01/02/2022'),
(12,'row', 1, '01/02/2022'),
(13,'row', 1, '01/03/2022'),
(3 ,'row' ,2, '01/03/2022'),
(4 ,'row' ,2, '01/03/2022'),
(5 ,'row' ,2, '01/04/2022'),
(6 ,'row', 2, '01/04/2022'),
(14,'row', 1, '01/04/2022')
), caplimit(limitcap, capid, tracker) as (
select * from values
(10, 1, 'sales'),
(5, 2, 'invite')
)
and the SQL:
SELECT
c.tracker,
c.LimitCap,
LEAST(count_if(date < '2022-01-04'), c.LimitCap) AS ActualCount,
COUNT(Instance) AS TotalCount
FROM USERINSTANCE AS u
JOIN CAPLIMIT AS c
ON u.CapID = c.CapID
GROUP BY 1,2;
we get:
TRACKER | LIMITCAP | ACTUALCOUNT | TOTALCOUNT |
---|---|---|---|
sales | 10 | 10 | 14 |
invite | 5 | 4 | 6 |