-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathqueries.sql
55 lines (47 loc) · 1.34 KB
/
queries.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
SELECT
*
FROM
participant as p
WHERE p."userId" = 2
OR p."userId" = 3;
-- Works for standard, non-group threads
SELECT "threadId" FROM participant p
WHERE p."userId" = 2
INTERSECT
SELECT "threadId" FROM participant
WHERE "userId" = 3;
-- This is getting warmer
-- Handles groups, but doesn't have capacity to match array
-- returns a thread on partial match, which isn't good
SELECT "threadId" FROM participant p
WHERE p."userId" = (6)
INTERSECT
SELECT "threadId" FROM participant
WHERE "userId" IN (6, 5, 4);
-- Only works for groups...
SELECT "userId" FROM participant p
WHERE p."threadId" = (
SELECT "threadId"
FROM participant
WHERE "userId" = 6
);
SELECT "userId",
array_agg("userId")
OVER(PARTITION BY "threadId")
FROM participant;
--
WITH participant_master
AS (SELECT "userId", "threadId",
array_agg("userId") OVER(PARTITION BY "threadId" ORDER BY "userId" DESC) participants
FROM participant)
SELECT CASE WHEN
participant_master.participants::INTEGER[] = ARRAY[6, 5, 4]::INTEGER[]
THEN true ELSE false
END
FROM participant_master
WHERE "userId" = 2;
WITH participant_master
AS (SELECT "userId", "threadId",
array_agg("userId") OVER(PARTITION BY "threadId" ORDER BY "userId" DESC) participants
FROM participant)
SELECT * FROM participant_master;