Style fix for subquery pushdown regression tests

With this commit we intented a more consistent style for the
regression tests we've added in the
  - multi_subquery_union.sql
  - multi_subquery_complex_queries.sql
  - multi_subquery_behavioral_analytics.sql
pull/1340/head
Onder Kalaci 2017-04-19 11:10:36 +03:00
parent 146beb3336
commit e86a867fbf
6 changed files with 4507 additions and 3348 deletions

View File

@ -382,7 +382,12 @@ ORDER BY
(
SELECT
users_table.user_id,
CASE WHEN events_table.event_type > 10 AND events_table.event_type < 12 THEN 'action=>1' ELSE 'action=>2' END AS event,
CASE
WHEN
events_table.event_type > 10 AND events_table.event_type < 12
THEN 'action=>1'
ELSE 'action=>2'
END AS event,
events_table.time
FROM
users_table,
@ -616,10 +621,17 @@ HINT: Consider using an equality filter on the distributed table's partition co
------------------------------------
SELECT user_id, value_1 from
(
SELECT user_id, value_1 From users_table
WHERE value_2 > 100 and user_id = 15 GROUP BY value_1, user_id HAVING count(*) > 1
SELECT
user_id, value_1 From users_table
WHERE
value_2 > 100 and user_id = 15
GROUP BY
value_1, user_id
HAVING
count(*) > 1
) AS a
ORDER BY user_id ASC, value_1 ASC;
ORDER BY
user_id ASC, value_1 ASC;
user_id | value_1
---------+---------
15 | 212
@ -633,10 +645,16 @@ ORDER BY user_id ASC, value_1 ASC;
-- same query with additional filter to make it not router plannable
SELECT user_id, value_1 from
(
SELECT user_id, value_1 From users_table
WHERE value_2 > 100 and (user_id = 15 OR user_id = 16) GROUP BY value_1, user_id HAVING count(*) > 1
SELECT
user_id, value_1 From users_table
WHERE
value_2 > 100 and (user_id = 15 OR user_id = 16)
GROUP BY
value_1, user_id
HAVING count(*) > 1
) AS a
ORDER BY user_id ASC, value_1 ASC;
ORDER BY
user_id ASC, value_1 ASC;
user_id | value_1
---------+---------
15 | 212
@ -658,12 +676,15 @@ ORDER BY user_id ASC, value_1 ASC;
SELECT user_id
FROM events_table
WHERE
event_type = 16 AND value_2 > 50
AND user_id IN
(SELECT user_id
FROM users_table
event_type = 16 AND value_2 > 50 AND
user_id IN
(SELECT
user_id
FROM
users_table
WHERE
value_1 = 15 AND value_2 > 25);
value_1 = 15 AND value_2 > 25
);
ERROR: could not run distributed query with join types other than INNER or OUTER JOINS
HINT: Consider joining tables on partition column and have equal filter on joining columns.
------------------------------------
@ -684,10 +705,15 @@ SELECT user_id FROM
user_id
FROM
events_table
WHERE event_type = 901
GROUP BY user_id HAVING count(*) > 3
WHERE
event_type = 901
GROUP BY
user_id
HAVING
count(*) > 3
) AS a
ORDER BY user_id;
ORDER BY
user_id;
user_id
---------
57
@ -710,7 +736,8 @@ FROM
short_list.user_id = ma.user_id and ma.value_1 < 50 and short_list.event_type < 50
) temp
ON users_table.user_id = temp.user_id
WHERE users_table.value_1 < 50;
WHERE
users_table.value_1 < 50;
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM assets;
count | count | avg
@ -723,13 +750,17 @@ DROP TABLE assets;
-- original query that fails
SELECT count(*) FROM
(
SELECT user_id
FROM users_table
WHERE (value_1 = '5'
OR value_1 = '13')
AND user_id NOT IN (select user_id from users_table where value_1 = '3')
GROUP BY user_id
HAVING count(distinct value_1) = 2
SELECT
user_id
FROM
users_table
WHERE
(value_1 = '5' OR value_1 = '13') AND
user_id NOT IN (select user_id from users_table where value_1 = '3')
GROUP BY
user_id
HAVING
count(distinct value_1) = 2
) as foo;
ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys
DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator.
@ -742,8 +773,10 @@ SELECT subquery_count FROM
users_table
WHERE
(value_1 = '5' OR value_1 = '13')
GROUP BY user_id
HAVING count(distinct value_1) = 2) as a
GROUP BY
user_id
HAVING
count(distinct value_1) = 2) as a
LEFT JOIN
(SELECT
user_id
@ -751,8 +784,14 @@ SELECT subquery_count FROM
users_table
WHERE
(value_1 = '3')
GROUP BY user_id) as b on a.user_id = b.user_id WHERE b.user_id IS NULL
GROUP BY a.user_id) AS inner_subquery;
GROUP BY
user_id) as b
ON a.user_id = b.user_id
WHERE
b.user_id IS NULL
GROUP BY
a.user_id
) AS inner_subquery;
subquery_count
----------------
1
@ -767,8 +806,10 @@ FROM (
users_table
WHERE
(value_1 = '5' OR value_1 = '13')
GROUP BY user_id
HAVING count(distinct value_1) = 2
GROUP BY
user_id
HAVING
count(distinct value_1) = 2
) as a
LEFT JOIN (
SELECT
@ -777,10 +818,13 @@ FROM (
users_table
WHERE
(value_1 = '3')
GROUP BY user_id) AS b
GROUP BY
user_id) AS b
ON a.user_id = b.user_id
WHERE b.user_id IS NULL
GROUP BY a.user_id;
WHERE
b.user_id IS NULL
GROUP BY
a.user_id;
subquery_count
----------------
1
@ -849,9 +893,11 @@ FROM (
ORDER BY time
LIMIT 1
) e5 ON true
where e1.user_id = 1
group by e1.user_id
limit 1;
WHERE
e1.user_id = 1
GROUP BY
e1.user_id
LIMIT 1;
user_id | viewed_homepage | use_demo | entered_credit_card | submit_card_info | see_bought_screen
---------+-----------------+----------+---------------------+------------------+-------------------
1 | 1 | | | |
@ -1021,8 +1067,10 @@ FROM (
users_table
WHERE
(value_1 > 5)
GROUP BY user_id
HAVING count(distinct value_1) > 88
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a
LEFT JOIN (
SELECT
@ -1032,9 +1080,12 @@ FROM (
WHERE
(value_1 > 3)) AS b
ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL
GROUP BY a.user_id
ORDER BY avg(b.value_3), 2, 1
WHERE
b.user_id IS NOT NULL
GROUP BY
a.user_id
ORDER BY
avg(b.value_3), 2, 1
LIMIT 5;
user_id | subquery_avg
---------+----------------------
@ -1045,7 +1096,7 @@ LIMIT 5;
77 | 449.9313725490196078
(5 rows)
-- add having
-- add having to the same query
SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM (
SELECT
@ -1065,10 +1116,14 @@ FROM (
WHERE
(value_1 > 3)) AS b
ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL
GROUP BY a.user_id
HAVING sum(b.value_3) > 50000
ORDER BY avg(b.value_3), 2, 1
WHERE
b.user_id IS NOT NULL
GROUP BY
a.user_id
HAVING
sum(b.value_3) > 50000
ORDER BY
avg(b.value_3), 2, 1
LIMIT 5;
user_id | subquery_avg
---------+----------------------
@ -1082,21 +1137,33 @@ LIMIT 5;
-- avg on the value_3 is not a resjunk
SELECT a.user_id, avg(b.value_2) as subquery_avg, avg(b.value_3)
FROM
(SELECT user_id
FROM users_table
WHERE (value_1 > 5)
GROUP BY user_id
HAVING count(distinct value_1) > 88
(SELECT
user_id
FROM
users_table
WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a
LEFT JOIN
(SELECT user_id, value_2, value_3
FROM users_table
WHERE (value_1 > 3)
(
SELECT
user_id, value_2, value_3
FROM
users_table
WHERE
(value_1 > 3)
) AS b
ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL
GROUP BY a.user_id
ORDER BY avg(b.value_3) DESC, 2, 1
WHERE
b.user_id IS NOT NULL
GROUP BY
a.user_id
ORDER BY
avg(b.value_3) DESC, 2, 1
LIMIT 5;
user_id | subquery_avg | avg
---------+----------------------+------------------
@ -1113,18 +1180,25 @@ SELECT u.user_id, sub.value_2, sub.value_3, COUNT(e2.user_id) counts
FROM
users_table u
LEFT OUTER JOIN LATERAL
(SELECT *
FROM events_table e1
WHERE e1.user_id = u.user_id
ORDER BY e1.value_3 DESC
(SELECT
*
FROM
events_table e1
WHERE
e1.user_id = u.user_id
ORDER BY
e1.value_3 DESC
LIMIT 1
) sub
ON true
LEFT OUTER JOIN events_table e2
ON e2.user_id = sub.user_id
WHERE e2.value_2 > 10 and e2.value_2 < 50 AND u.value_2 > 10 and u.value_2 < 50
GROUP BY u.user_id, sub.value_2, sub.value_3
ORDER BY 4 DESC, 1 DESC, 2 ASC, 3 ASC
WHERE
e2.value_2 > 10 AND e2.value_2 < 50 AND u.value_2 > 10 AND u.value_2 < 50
GROUP BY
u.user_id, sub.value_2, sub.value_3
ORDER BY
4 DESC, 1 DESC, 2 ASC, 3 ASC
LIMIT 10;
user_id | value_2 | value_3 | counts
---------+---------+---------+--------
@ -1146,12 +1220,16 @@ SELECT
count(*) as users_count
FROM events_table
JOIN
(SELECT DISTINCT user_id
FROM users_table
(SELECT
DISTINCT user_id
FROM
users_table
) as distinct_users
ON distinct_users.user_id = events_table.user_id
GROUP BY distinct_users.user_id
ORDER BY users_count desc, avg_type DESC
GROUP BY
distinct_users.user_id
ORDER BY
users_count desc, avg_type DESC
LIMIT 5;
avg_type | users_count
----------------------+-------------
@ -1170,13 +1248,17 @@ FROM events_table
JOIN
(SELECT distinct_users.user_id, count(1) as ct
FROM
(SELECT user_id
FROM users_table
(SELECT
user_id
FROM
users_table
) as distinct_users
GROUP BY distinct_users.user_id
GROUP BY
distinct_users.user_id
) as users_count
ON users_count.user_id = events_table.user_id
ORDER BY users_count.ct desc, event_type DESC
ORDER BY
users_count.ct desc, event_type DESC
LIMIT 5;
event_type | ct
------------+-----
@ -1190,17 +1272,25 @@ LIMIT 5;
--- now, test (subquery JOIN subquery)
SELECT n1.user_id, count_1, total_count
FROM
(SELECT user_id, count(1) as count_1
FROM users_table
GROUP BY user_id
(SELECT
user_id, count(1) as count_1
FROM
users_table
GROUP BY
user_id
) n1
INNER JOIN
(SELECT user_id, count(1) as total_count
FROM events_table
GROUP BY user_id, event_type
(
SELECT
user_id, count(1) as total_count
FROM
events_table
GROUP BY
user_id, event_type
) n2
ON (n2.user_id = n1.user_id)
ORDER BY total_count DESC, count_1 DESC, 1 DESC
ORDER BY
total_count DESC, count_1 DESC, 1 DESC
LIMIT 10;
user_id | count_1 | total_count
---------+---------+-------------
@ -1218,17 +1308,26 @@ LIMIT 10;
SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM
(SELECT user_id
FROM users_table
WHERE (value_1 > 5)
GROUP BY user_id
HAVING count(distinct value_1) > 88
(SELECT
user_id
FROM
users_table
WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a
LEFT JOIN
(SELECT DISTINCT ON (user_id) user_id, value_2, value_3
FROM users_table
WHERE (value_1 > 3)
ORDER BY 1,2,3
(SELECT
DISTINCT ON (user_id) user_id, value_2, value_3
FROM
users_table
WHERE
(value_1 > 3)
ORDER BY
1,2,3
) AS b
ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL
@ -1248,17 +1347,26 @@ LIMIT 5;
-- when used in target list
SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM
(SELECT user_id
FROM users_table
WHERE (value_1 > 5)
GROUP BY user_id
HAVING count(distinct value_1) > 88
(SELECT
user_id
FROM
users_table
WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a
LEFT JOIN
(SELECT DISTINCT ON (value_2) value_2 , user_id, value_3
FROM users_table
WHERE (value_1 > 3)
ORDER BY 1,2,3
(SELECT
DISTINCT ON (value_2) value_2 , user_id, value_3
FROM
users_table
WHERE
(value_1 > 3)
ORDER BY
1,2,3
) AS b
USING (user_id)
GROUP BY user_id;
@ -1266,22 +1374,34 @@ ERROR: cannot push down this subquery
DETAIL: Distinct on columns without partition column is currently unsupported
SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM
(SELECT user_id
FROM users_table
WHERE (value_1 > 5)
GROUP BY user_id
HAVING count(distinct value_1) > 88
(SELECT
user_id
FROM
users_table
WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a
LEFT JOIN
(SELECT DISTINCT ON (value_2, user_id) value_2 , user_id, value_3
FROM users_table
WHERE (value_1 > 3)
ORDER BY 1,2,3
(SELECT
DISTINCT ON (value_2, user_id) value_2 , user_id, value_3
FROM
users_table
WHERE
(value_1 > 3)
ORDER BY
1,2,3
) AS b
ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL
GROUP BY a.user_id
ORDER BY avg(b.value_3), 2, 1
WHERE
b.user_id IS NOT NULL
GROUP BY
a.user_id
ORDER BY
avg(b.value_3), 2, 1
LIMIT 5;
user_id | subquery_avg
---------+----------------------
@ -1297,22 +1417,30 @@ FROM
(SELECT *
FROM
(
(SELECT event_type, user_id as a_user_id FROM events_table) AS a
(SELECT
event_type, user_id as a_user_id
FROM
events_table) AS a
JOIN
(SELECT
ma.user_id AS user_id, ma.value_2 AS value_2,
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM users_table AS ma
WHERE (ma.value_2 > 100)
ORDER BY prob DESC, user_id DESC
FROM
users_table AS ma
WHERE
(ma.value_2 > 100)
ORDER BY
prob DESC, user_id DESC
LIMIT 10
) AS ma
ON (a.a_user_id = ma.user_id)
) AS inner_sub
ORDER BY prob DESC, user_id DESC
ORDER BY
prob DESC, user_id DESC
LIMIT 10
) AS outer_sub
ORDER BY prob DESC, event_type DESC, user_id DESC
ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10;
user_id | event_type
---------+------------
@ -1332,18 +1460,25 @@ LIMIT 10;
-- ordering difference in the previous one's inner query
SELECT user_id, event_type
FROM
(SELECT event_type, user_id as a_user_id FROM events_table) AS a
(SELECT
event_type, user_id as a_user_id
FROM
events_table) AS a
JOIN
(SELECT
ma.user_id AS user_id, ma.value_2 AS value_2,
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM users_table AS ma
WHERE (ma.value_2 > 100)
ORDER BY prob DESC, user_id DESC
FROM
users_table AS ma
WHERE
(ma.value_2 > 100)
ORDER BY
prob DESC, user_id DESC
LIMIT 10
) AS ma
ON (a.a_user_id = ma.user_id)
ORDER BY prob DESC, event_type DESC, user_id DESC
ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10;
user_id | event_type
---------+------------
@ -1365,22 +1500,31 @@ FROM
(SELECT *
FROM
(
(SELECT event_type, user_id as a_user_id FROM events_table) AS a
(SELECT
event_type, user_id as a_user_id
FROM
events_table
) AS a
JOIN
(SELECT
ma.user_id AS user_id, ma.value_2 AS value_2,
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM users_table AS ma
WHERE (ma.value_2 > 100)
ORDER BY prob DESC, user_id DESC
FROM
users_table AS ma
WHERE
(ma.value_2 > 100)
ORDER BY
prob DESC, user_id DESC
LIMIT 10
) AS ma
ON (a.a_user_id = ma.user_id)
) AS inner_sub
ORDER BY prob DESC, event_type DESC, user_id DESC
ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10
) AS outer_sub
ORDER BY prob DESC, event_type DESC, user_id DESC
ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10;
user_id | event_type
---------+------------
@ -1423,80 +1567,63 @@ CREATE OR REPLACE FUNCTION array_index(ANYARRAY, ANYELEMENT)
SELECT *
FROM
(SELECT *
FROM
(
(SELECT
user_id AS user_id_e,
event_type as event_type_e
FROM
events_table
) AS ma_e
FROM (
(SELECT user_id AS user_id_e,
event_type AS event_type_e
FROM events_table ) AS ma_e
JOIN
(SELECT
value_2,
(SELECT value_2,
value_3,
user_id
FROM
(SELECT *
FROM
(
FROM (
(SELECT user_id_p AS user_id
FROM
(SELECT *
FROM (
(SELECT
user_id AS user_id_p
FROM
(
(SELECT user_id AS user_id_p
FROM events_table
WHERE (event_type IN (1, 2, 3, 4, 5))
) AS ma_p
JOIN
(SELECT user_id AS user_id_a
FROM users_table
WHERE (value_2 % 5 = 1)
) AS a
ON (a.user_id_a = ma_p.user_id_p)
)
) AS a_ma_p
) AS inner_filter_q
events_table
WHERE
(event_type IN (1,2,3,4,5)) ) AS ma_p
JOIN
(SELECT
value_2,
value_3,
user_id AS user_id_ck
FROM events_table
WHERE event_type = ANY(ARRAY [10, 11, 12])
user_id AS user_id_a
FROM
users_table
WHERE
(value_2 % 5 = 1) ) AS a
ON (a.user_id_a = ma_p.user_id_p) ) ) AS a_ma_p ) AS inner_filter_q
JOIN
(SELECT
value_2, value_3, user_id AS user_id_ck
FROM
events_table
WHERE
event_type = ANY(ARRAY [10, 11, 12])
ORDER BY
value_3 ASC,
user_id_ck DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10
) AS ma_ck
ON (ma_ck.user_id_ck = inner_filter_q.user_id)
) AS inner_sub_q
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10 )
AS ma_ck ON (ma_ck.user_id_ck = inner_filter_q.user_id) )
AS inner_sub_q
ORDER BY
value_3 ASC,
user_id_ck DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10
) AS outer_sub_q
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10 )
AS outer_sub_q
ORDER BY
value_3 ASC,
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10) AS inner_search_q
ON (ma_e.user_id_e = inner_search_q.user_id)
) AS outer_inner_sub_q
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10)
AS inner_search_q
ON (ma_e.user_id_e = inner_search_q.user_id) )
AS outer_inner_sub_q
ORDER BY
value_3 ASC,
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
event_type_e DESC
LIMIT 10) AS outer_outer_sub_q
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
LIMIT 10)
AS outer_outer_sub_q
ORDER BY
value_3 ASC,
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
event_type_e DESC
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
LIMIT 10;
user_id_e | event_type_e | value_2 | value_3 | user_id
-----------+--------------+---------+---------+---------
@ -1518,33 +1645,39 @@ SELECT *
FROM
(
(SELECT
user_id AS user_id_e,
event_type as event_type_e
user_id AS user_id_e, event_type as event_type_e
FROM
events_table
) AS ma_e
JOIN
(SELECT
value_2,
value_3,
user_id
value_2, value_3, user_id
FROM
(SELECT *
(SELECT
*
FROM
(
(SELECT user_id_p AS user_id
(SELECT
user_id_p AS user_id
FROM
(SELECT *
(SELECT
*
FROM
(
(SELECT user_id AS user_id_p
FROM events_table
WHERE (event_type IN (1, 2, 3, 4, 5))
(SELECT
user_id AS user_id_p
FROM
events_table
WHERE
(event_type IN (1, 2, 3, 4, 5))
) AS ma_p
JOIN
(SELECT user_id AS user_id_a
FROM users_table
WHERE (value_2 % 5 = 1)
(SELECT
user_id AS user_id_a
FROM
users_table
WHERE
(value_2 % 5 = 1)
) AS a
ON (a.user_id_a = ma_p.user_id_p)
)
@ -1552,37 +1685,28 @@ FROM
) AS inner_filter_q
JOIN
(SELECT
value_2,
value_3,
user_id AS user_id_ck
FROM events_table
WHERE event_type = ANY(ARRAY [10, 11, 12])
value_2, value_3, user_id AS user_id_ck
FROM
events_table
WHERE
event_type = ANY(ARRAY [10, 11, 12])
ORDER BY
value_3 ASC,
user_id_ck DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10
) AS ma_ck
ON (ma_ck.user_id_ck = inner_filter_q.user_id)
) AS inner_sub_q
ORDER BY
value_3 ASC,
user_id_ck DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10
) AS outer_sub_q
ORDER BY
value_3 ASC,
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10) AS inner_search_q
ON (ma_e.user_id_e = inner_search_q.user_id)
) AS outer_inner_sub_q
ORDER BY
value_3 ASC,
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
event_type_e DESC
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
LIMIT 10;
user_id_e | event_type_e | value_2 | value_3 | user_id
-----------+--------------+---------+---------+---------
@ -1679,11 +1803,13 @@ SELECT user_id, array_length(events_table, 1)
FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM (
SELECT u.user_id, e.event_type::text AS event, e.time
FROM users_table AS u,
SELECT
u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e
WHERE u.user_id = e.user_id
AND e.event_type IN (100, 101, 102)
WHERE
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t
GROUP BY user_id
) q
@ -1705,11 +1831,13 @@ SELECT user_id, array_length(events_table, 1)
FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM (
SELECT u.user_id, e.event_type::text AS event, e.time
FROM users_table AS u,
SELECT
u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e
WHERE u.user_id = e.user_id
AND e.event_type IN (100, 101, 102)
WHERE
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t
GROUP BY user_id
) q
@ -1731,11 +1859,13 @@ SELECT user_id, array_length(events_table, 1)
FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM (
SELECT u.user_id, e.event_type::text AS event, e.time
FROM users_table AS u,
SELECT
u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e
WHERE u.user_id = e.user_id
AND e.event_type IN (100, 101, 102)
WHERE
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t
GROUP BY user_id
) q
@ -1757,11 +1887,13 @@ SELECT user_id, array_length(events_table, 1)
FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM (
SELECT u.user_id, e.event_type::text AS event, e.time
FROM users_table AS u,
SELECT
u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e
WHERE u.user_id = e.user_id
AND e.event_type IN (100, 101, 102)
WHERE
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t
GROUP BY user_id
) q

File diff suppressed because it is too large Load Diff

View File

@ -191,32 +191,40 @@ FROM (
( SELECT user_id,
sum(counter)
FROM
( SELECT user_id,
sum(value_2) AS counter
FROM users_table
GROUP BY user_id
(SELECT
user_id, sum(value_2) AS counter
FROM
users_table
GROUP BY
user_id
UNION
SELECT user_id,
sum(value_2) AS counter
FROM events_table
GROUP BY user_id ) user_id_1
GROUP BY user_id)
SELECT
user_id, sum(value_2) AS counter
FROM
events_table
GROUP BY
user_id) user_id_1
GROUP BY
user_id)
UNION
( SELECT user_id,
sum(counter)
(SELECT
user_id, sum(counter)
FROM
(SELECT
user_id, sum(value_2) AS counter
FROM users_table
GROUP BY user_id
FROM
users_table
GROUP BY
user_id
UNION
SELECT user_id, sum(value_2) AS counter
FROM events_table
GROUP BY user_id) user_id_2
GROUP BY user_id)) AS ftop
SELECT
user_id, sum(value_2) AS counter
FROM
events_table
GROUP BY
user_id) user_id_2
GROUP BY
user_id)) AS ftop
ORDER BY 2 DESC, 1 DESC
LIMIT 5;
user_id | sum
@ -233,40 +241,45 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
FROM
( SELECT *, random()
FROM
( SELECT "t"."user_id",
"t"."time",
unnest("t"."collected_events") AS "event_types"
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
FROM
( SELECT "t1"."user_id",
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
FROM (
(SELECT *
FROM
(SELECT "events"."user_id",
"events"."time",
0 AS event
FROM events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1)
(SELECT
"events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1)
UNION
(SELECT *
FROM
(SELECT "events"."user_id", "events"."time", 1 AS event
FROM events_table as "events"
WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
(SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
UNION
(SELECT *
FROM
(SELECT "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events"
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
(SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
UNION
(SELECT *
FROM
(SELECT "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events"
WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1
(SELECT
"events"."user_id", "events"."time", 3 AS event
FROM
events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1
GROUP BY "t1"."user_id") AS t) "q"
) as final_query
GROUP BY types
@ -285,34 +298,39 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
FROM
(SELECT *, random()
FROM
( SELECT "t"."user_id",
"t"."time",
unnest("t"."collected_events") AS "event_types"
(SELECT
"t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
FROM
( SELECT "t1"."user_id",
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
(SELECT
"t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
FROM(
(SELECT "events"."user_id",
"events"."time",
0 AS event
FROM events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15))
(SELECT
"events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15))
UNION
(SELECT "events"."user_id", "events"."time", 1 AS event
FROM events_table as "events"
WHERE event_type IN (15, 16, 17, 18, 19) )
(SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION
(SELECT "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events"
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
(SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION
(SELECT "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events"
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
(SELECT
"events"."user_id", "events"."time", 3 AS event
FROM
events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
GROUP BY "t1"."user_id") AS t) "q"
) as final_query
GROUP BY types
@ -328,35 +346,37 @@ ORDER BY types;
-- again excatly the same query with top level wrapper removed
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
FROM
( SELECT "t"."user_id",
"t"."time",
unnest("t"."collected_events") AS "event_types"
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
FROM
( SELECT "t1"."user_id",
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
FROM (
(SELECT "events"."user_id",
"events"."time",
0 AS event
FROM events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15)
)
(SELECT
"events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15))
UNION
(SELECT "events"."user_id", "events"."time", 1 AS event
FROM events_table as "events"
WHERE event_type IN (15, 16, 17, 18, 19) )
(SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION
(SELECT "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events"
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
(SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION
(SELECT "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events"
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
(SELECT
"events"."user_id", "events"."time", 3 AS event
FROM
events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
GROUP BY "t1"."user_id") AS t) "q"
GROUP BY types
ORDER BY types;
@ -375,27 +395,36 @@ FROM
FROM
( SELECT "t1"."user_id"
FROM (
(SELECT "events"."user_id",
"events"."time",
0 AS event
FROM events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15)
)
(SELECT
"events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15))
UNION
(SELECT "events"."user_id", "events"."time", 1 AS event
FROM events_table as "events"
WHERE event_type IN (15, 16, 17, 18, 19) )
(SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION
(SELECT "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events"
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
(SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION
(SELECT "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events"
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
) AS t) "q" ORDER BY 1 LIMIT 5;
(SELECT
"events"."user_id", "events"."time", 3 AS event
FROM
events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
) AS t) "q"
ORDER BY 1
LIMIT 5;
user_id
---------
0
@ -408,35 +437,37 @@ FROM
-- a very similar query UNION ALL
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
FROM
( SELECT "t"."user_id",
"t"."time",
unnest("t"."collected_events") AS "event_types"
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
FROM
( SELECT "t1"."user_id",
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
FROM (
(SELECT "events"."user_id",
"events"."time",
0 AS event
FROM events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15)
)
(SELECT
"events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15))
UNION ALL
(SELECT "events"."user_id", "events"."time", 1 AS event
FROM events_table as "events"
WHERE event_type IN (15, 16, 17, 18, 19) )
(SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION ALL
(SELECT "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events"
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
(SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION ALL
(SELECT "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events"
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
(SELECT
"events"."user_id", "events"."time", 3 AS event
FROM
events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
GROUP BY "t1"."user_id") AS t) "q"
GROUP BY types
ORDER BY types;
@ -701,32 +732,40 @@ FROM (
( SELECT user_id,
sum(counter)
FROM
( SELECT user_id,
sum(value_2) AS counter
FROM users_table
GROUP BY user_id
UNION
SELECT user_id,
sum(value_2) AS counter
FROM events_table
GROUP BY user_id ) user_id_1
GROUP BY user_id)
UNION
( SELECT user_id,
sum(counter)
(SELECT
user_id, sum(value_2) AS counter
FROM
( SELECT sum(value_2) AS counter,
users_table
GROUP BY
user_id
FROM users_table
GROUP BY user_id
UNION
SELECT user_id,
sum(value_2) AS counter
FROM events_table
GROUP BY user_id) user_id_2
GROUP BY user_id)) AS ftop;
SELECT
user_id, sum(value_2) AS counter
FROM
events_table
GROUP BY
user_id) user_id_1
GROUP BY
user_id)
UNION
(SELECT
user_id, sum(counter)
FROM
(SELECT
sum(value_2) AS counter, user_id
FROM
users_table
GROUP BY
user_id
UNION
SELECT
user_id, sum(value_2) AS counter
FROM
events_table
GROUP BY
user_id) user_id_2
GROUP BY
user_id)) AS ftop;
ERROR: cannot pushdown the subquery since all leaves of the UNION does not include partition key at the same position
DETAIL: Each leaf query of the UNION should return partition key at the same position on its target list.
-- some UNION all queries that are going to be pulled up
@ -815,31 +854,46 @@ ORDER BY 1 DESC, 2 DESC
LIMIT 5;
ERROR: cannot push down this subquery
DETAIL: Subqueries without relations are unsupported
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
FROM
( SELECT "t"."user_id",
"t"."time",
unnest("t"."collected_events") AS "event_types"
( SELECT *, random()
FROM
( SELECT "t1"."user_id",
min("t1"."time") AS "time",
array_agg(("t1"."event") ORDER BY time ASC, event DESC) AS collected_events
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
FROM
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
FROM (
(SELECT "events"."user_id", "events"."time", 0 AS event
FROM events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15)
)
(SELECT *
FROM
(SELECT
"events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1)
UNION
(SELECT "events"."user_id", "events"."time", 1 AS event
FROM events_table as "events"
WHERE event_type IN (15, 16, 17, 18, 19) )
(SELECT *
FROM
(SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
UNION
(SELECT "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events"
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
(SELECT *
FROM
(SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
UNION
(SELECT 1, now(), 3 AS event)) t1
(SELECT *
FROM
(SELECT 1, now(), 3 AS event) events_subquery_4)) t1
GROUP BY "t1"."user_id") AS t) "q"
) as final_query
GROUP BY types
ORDER BY types;
ERROR: cannot push down this subquery

View File

@ -325,7 +325,12 @@ ORDER BY
(
SELECT
users_table.user_id,
CASE WHEN events_table.event_type > 10 AND events_table.event_type < 12 THEN 'action=>1' ELSE 'action=>2' END AS event,
CASE
WHEN
events_table.event_type > 10 AND events_table.event_type < 12
THEN 'action=>1'
ELSE 'action=>2'
END AS event,
events_table.time
FROM
users_table,
@ -522,18 +527,31 @@ SELECT user_id,
------------------------------------
SELECT user_id, value_1 from
(
SELECT user_id, value_1 From users_table
WHERE value_2 > 100 and user_id = 15 GROUP BY value_1, user_id HAVING count(*) > 1
SELECT
user_id, value_1 From users_table
WHERE
value_2 > 100 and user_id = 15
GROUP BY
value_1, user_id
HAVING
count(*) > 1
) AS a
ORDER BY user_id ASC, value_1 ASC;
ORDER BY
user_id ASC, value_1 ASC;
-- same query with additional filter to make it not router plannable
SELECT user_id, value_1 from
(
SELECT user_id, value_1 From users_table
WHERE value_2 > 100 and (user_id = 15 OR user_id = 16) GROUP BY value_1, user_id HAVING count(*) > 1
SELECT
user_id, value_1 From users_table
WHERE
value_2 > 100 and (user_id = 15 OR user_id = 16)
GROUP BY
value_1, user_id
HAVING count(*) > 1
) AS a
ORDER BY user_id ASC, value_1 ASC;
ORDER BY
user_id ASC, value_1 ASC;
------------------------------------
-- Find me all users_table who has done some event and has filters
@ -542,12 +560,15 @@ ORDER BY user_id ASC, value_1 ASC;
SELECT user_id
FROM events_table
WHERE
event_type = 16 AND value_2 > 50
AND user_id IN
(SELECT user_id
FROM users_table
event_type = 16 AND value_2 > 50 AND
user_id IN
(SELECT
user_id
FROM
users_table
WHERE
value_1 = 15 AND value_2 > 25);
value_1 = 15 AND value_2 > 25
);
------------------------------------
-- Which events_table did people who has done some specific events_table
@ -566,10 +587,15 @@ SELECT user_id FROM
user_id
FROM
events_table
WHERE event_type = 901
GROUP BY user_id HAVING count(*) > 3
WHERE
event_type = 901
GROUP BY
user_id
HAVING
count(*) > 3
) AS a
ORDER BY user_id;
ORDER BY
user_id;
------------------------------------
-- Find my assets that have the highest probability and fetch their metadata
@ -588,7 +614,8 @@ FROM
short_list.user_id = ma.user_id and ma.value_1 < 50 and short_list.event_type < 50
) temp
ON users_table.user_id = temp.user_id
WHERE users_table.value_1 < 50;
WHERE
users_table.value_1 < 50;
-- get some statistics from the aggregated results to ensure the results are correct
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM assets;
@ -599,13 +626,17 @@ DROP TABLE assets;
-- original query that fails
SELECT count(*) FROM
(
SELECT user_id
FROM users_table
WHERE (value_1 = '5'
OR value_1 = '13')
AND user_id NOT IN (select user_id from users_table where value_1 = '3')
GROUP BY user_id
HAVING count(distinct value_1) = 2
SELECT
user_id
FROM
users_table
WHERE
(value_1 = '5' OR value_1 = '13') AND
user_id NOT IN (select user_id from users_table where value_1 = '3')
GROUP BY
user_id
HAVING
count(distinct value_1) = 2
) as foo;
-- previous push down query
@ -617,8 +648,10 @@ SELECT subquery_count FROM
users_table
WHERE
(value_1 = '5' OR value_1 = '13')
GROUP BY user_id
HAVING count(distinct value_1) = 2) as a
GROUP BY
user_id
HAVING
count(distinct value_1) = 2) as a
LEFT JOIN
(SELECT
user_id
@ -626,8 +659,14 @@ SELECT subquery_count FROM
users_table
WHERE
(value_1 = '3')
GROUP BY user_id) as b on a.user_id = b.user_id WHERE b.user_id IS NULL
GROUP BY a.user_id) AS inner_subquery;
GROUP BY
user_id) as b
ON a.user_id = b.user_id
WHERE
b.user_id IS NULL
GROUP BY
a.user_id
) AS inner_subquery;
-- new pushdown query without single range table entry at top requirement
SELECT count(*) as subquery_count
@ -638,8 +677,10 @@ FROM (
users_table
WHERE
(value_1 = '5' OR value_1 = '13')
GROUP BY user_id
HAVING count(distinct value_1) = 2
GROUP BY
user_id
HAVING
count(distinct value_1) = 2
) as a
LEFT JOIN (
SELECT
@ -648,10 +689,13 @@ FROM (
users_table
WHERE
(value_1 = '3')
GROUP BY user_id) AS b
GROUP BY
user_id) AS b
ON a.user_id = b.user_id
WHERE b.user_id IS NULL
GROUP BY a.user_id;
WHERE
b.user_id IS NULL
GROUP BY
a.user_id;
-- multi-subquery-join
-- The first query has filters on partion column to make it router plannable
@ -716,9 +760,11 @@ FROM (
ORDER BY time
LIMIT 1
) e5 ON true
where e1.user_id = 1
group by e1.user_id
limit 1;
WHERE
e1.user_id = 1
GROUP BY
e1.user_id
LIMIT 1;
-- Same query without all limitations
SELECT
@ -853,8 +899,10 @@ FROM (
users_table
WHERE
(value_1 > 5)
GROUP BY user_id
HAVING count(distinct value_1) > 88
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a
LEFT JOIN (
SELECT
@ -864,12 +912,15 @@ FROM (
WHERE
(value_1 > 3)) AS b
ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL
GROUP BY a.user_id
ORDER BY avg(b.value_3), 2, 1
WHERE
b.user_id IS NOT NULL
GROUP BY
a.user_id
ORDER BY
avg(b.value_3), 2, 1
LIMIT 5;
-- add having
-- add having to the same query
SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM (
SELECT
@ -889,30 +940,46 @@ FROM (
WHERE
(value_1 > 3)) AS b
ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL
GROUP BY a.user_id
HAVING sum(b.value_3) > 50000
ORDER BY avg(b.value_3), 2, 1
WHERE
b.user_id IS NOT NULL
GROUP BY
a.user_id
HAVING
sum(b.value_3) > 50000
ORDER BY
avg(b.value_3), 2, 1
LIMIT 5;
-- avg on the value_3 is not a resjunk
SELECT a.user_id, avg(b.value_2) as subquery_avg, avg(b.value_3)
FROM
(SELECT user_id
FROM users_table
WHERE (value_1 > 5)
GROUP BY user_id
HAVING count(distinct value_1) > 88
(SELECT
user_id
FROM
users_table
WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a
LEFT JOIN
(SELECT user_id, value_2, value_3
FROM users_table
WHERE (value_1 > 3)
(
SELECT
user_id, value_2, value_3
FROM
users_table
WHERE
(value_1 > 3)
) AS b
ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL
GROUP BY a.user_id
ORDER BY avg(b.value_3) DESC, 2, 1
WHERE
b.user_id IS NOT NULL
GROUP BY
a.user_id
ORDER BY
avg(b.value_3) DESC, 2, 1
LIMIT 5;
-- a powerful query structure that analyzes users/events
@ -921,18 +988,25 @@ SELECT u.user_id, sub.value_2, sub.value_3, COUNT(e2.user_id) counts
FROM
users_table u
LEFT OUTER JOIN LATERAL
(SELECT *
FROM events_table e1
WHERE e1.user_id = u.user_id
ORDER BY e1.value_3 DESC
(SELECT
*
FROM
events_table e1
WHERE
e1.user_id = u.user_id
ORDER BY
e1.value_3 DESC
LIMIT 1
) sub
ON true
LEFT OUTER JOIN events_table e2
ON e2.user_id = sub.user_id
WHERE e2.value_2 > 10 and e2.value_2 < 50 AND u.value_2 > 10 and u.value_2 < 50
GROUP BY u.user_id, sub.value_2, sub.value_3
ORDER BY 4 DESC, 1 DESC, 2 ASC, 3 ASC
WHERE
e2.value_2 > 10 AND e2.value_2 < 50 AND u.value_2 > 10 AND u.value_2 < 50
GROUP BY
u.user_id, sub.value_2, sub.value_3
ORDER BY
4 DESC, 1 DESC, 2 ASC, 3 ASC
LIMIT 10;
-- distinct users joined with events
@ -941,12 +1015,16 @@ SELECT
count(*) as users_count
FROM events_table
JOIN
(SELECT DISTINCT user_id
FROM users_table
(SELECT
DISTINCT user_id
FROM
users_table
) as distinct_users
ON distinct_users.user_id = events_table.user_id
GROUP BY distinct_users.user_id
ORDER BY users_count desc, avg_type DESC
GROUP BY
distinct_users.user_id
ORDER BY
users_count desc, avg_type DESC
LIMIT 5;
-- reduce the data set, aggregate and join
@ -957,44 +1035,65 @@ FROM events_table
JOIN
(SELECT distinct_users.user_id, count(1) as ct
FROM
(SELECT user_id
FROM users_table
(SELECT
user_id
FROM
users_table
) as distinct_users
GROUP BY distinct_users.user_id
GROUP BY
distinct_users.user_id
) as users_count
ON users_count.user_id = events_table.user_id
ORDER BY users_count.ct desc, event_type DESC
ORDER BY
users_count.ct desc, event_type DESC
LIMIT 5;
--- now, test (subquery JOIN subquery)
SELECT n1.user_id, count_1, total_count
FROM
(SELECT user_id, count(1) as count_1
FROM users_table
GROUP BY user_id
(SELECT
user_id, count(1) as count_1
FROM
users_table
GROUP BY
user_id
) n1
INNER JOIN
(SELECT user_id, count(1) as total_count
FROM events_table
GROUP BY user_id, event_type
(
SELECT
user_id, count(1) as total_count
FROM
events_table
GROUP BY
user_id, event_type
) n2
ON (n2.user_id = n1.user_id)
ORDER BY total_count DESC, count_1 DESC, 1 DESC
ORDER BY
total_count DESC, count_1 DESC, 1 DESC
LIMIT 10;
SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM
(SELECT user_id
FROM users_table
WHERE (value_1 > 5)
GROUP BY user_id
HAVING count(distinct value_1) > 88
(SELECT
user_id
FROM
users_table
WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a
LEFT JOIN
(SELECT DISTINCT ON (user_id) user_id, value_2, value_3
FROM users_table
WHERE (value_1 > 3)
ORDER BY 1,2,3
(SELECT
DISTINCT ON (user_id) user_id, value_2, value_3
FROM
users_table
WHERE
(value_1 > 3)
ORDER BY
1,2,3
) AS b
ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL
@ -1006,39 +1105,60 @@ LIMIT 5;
-- when used in target list
SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM
(SELECT user_id
FROM users_table
WHERE (value_1 > 5)
GROUP BY user_id
HAVING count(distinct value_1) > 88
(SELECT
user_id
FROM
users_table
WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a
LEFT JOIN
(SELECT DISTINCT ON (value_2) value_2 , user_id, value_3
FROM users_table
WHERE (value_1 > 3)
ORDER BY 1,2,3
(SELECT
DISTINCT ON (value_2) value_2 , user_id, value_3
FROM
users_table
WHERE
(value_1 > 3)
ORDER BY
1,2,3
) AS b
USING (user_id)
GROUP BY user_id;
SELECT a.user_id, avg(b.value_2) as subquery_avg
FROM
(SELECT user_id
FROM users_table
WHERE (value_1 > 5)
GROUP BY user_id
HAVING count(distinct value_1) > 88
(SELECT
user_id
FROM
users_table
WHERE
(value_1 > 5)
GROUP BY
user_id
HAVING
count(distinct value_1) > 88
) as a
LEFT JOIN
(SELECT DISTINCT ON (value_2, user_id) value_2 , user_id, value_3
FROM users_table
WHERE (value_1 > 3)
ORDER BY 1,2,3
(SELECT
DISTINCT ON (value_2, user_id) value_2 , user_id, value_3
FROM
users_table
WHERE
(value_1 > 3)
ORDER BY
1,2,3
) AS b
ON a.user_id = b.user_id
WHERE b.user_id IS NOT NULL
GROUP BY a.user_id
ORDER BY avg(b.value_3), 2, 1
WHERE
b.user_id IS NOT NULL
GROUP BY
a.user_id
ORDER BY
avg(b.value_3), 2, 1
LIMIT 5;
SELECT user_id, event_type
@ -1046,40 +1166,55 @@ FROM
(SELECT *
FROM
(
(SELECT event_type, user_id as a_user_id FROM events_table) AS a
(SELECT
event_type, user_id as a_user_id
FROM
events_table) AS a
JOIN
(SELECT
ma.user_id AS user_id, ma.value_2 AS value_2,
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM users_table AS ma
WHERE (ma.value_2 > 100)
ORDER BY prob DESC, user_id DESC
FROM
users_table AS ma
WHERE
(ma.value_2 > 100)
ORDER BY
prob DESC, user_id DESC
LIMIT 10
) AS ma
ON (a.a_user_id = ma.user_id)
) AS inner_sub
ORDER BY prob DESC, user_id DESC
ORDER BY
prob DESC, user_id DESC
LIMIT 10
) AS outer_sub
ORDER BY prob DESC, event_type DESC, user_id DESC
ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10;
-- very similar query but produces different result due to
-- ordering difference in the previous one's inner query
SELECT user_id, event_type
FROM
(SELECT event_type, user_id as a_user_id FROM events_table) AS a
(SELECT
event_type, user_id as a_user_id
FROM
events_table) AS a
JOIN
(SELECT
ma.user_id AS user_id, ma.value_2 AS value_2,
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM users_table AS ma
WHERE (ma.value_2 > 100)
ORDER BY prob DESC, user_id DESC
FROM
users_table AS ma
WHERE
(ma.value_2 > 100)
ORDER BY
prob DESC, user_id DESC
LIMIT 10
) AS ma
ON (a.a_user_id = ma.user_id)
ORDER BY prob DESC, event_type DESC, user_id DESC
ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10;
-- now they produce the same result when ordering fixed in 'outer_sub'
@ -1088,22 +1223,31 @@ FROM
(SELECT *
FROM
(
(SELECT event_type, user_id as a_user_id FROM events_table) AS a
(SELECT
event_type, user_id as a_user_id
FROM
events_table
) AS a
JOIN
(SELECT
ma.user_id AS user_id, ma.value_2 AS value_2,
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
FROM users_table AS ma
WHERE (ma.value_2 > 100)
ORDER BY prob DESC, user_id DESC
FROM
users_table AS ma
WHERE
(ma.value_2 > 100)
ORDER BY
prob DESC, user_id DESC
LIMIT 10
) AS ma
ON (a.a_user_id = ma.user_id)
) AS inner_sub
ORDER BY prob DESC, event_type DESC, user_id DESC
ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10
) AS outer_sub
ORDER BY prob DESC, event_type DESC, user_id DESC
ORDER BY
prob DESC, event_type DESC, user_id DESC
LIMIT 10;
-- this is one complex join query derived from a user's production query
@ -1129,80 +1273,63 @@ CREATE OR REPLACE FUNCTION array_index(ANYARRAY, ANYELEMENT)
SELECT *
FROM
(SELECT *
FROM
(
(SELECT
user_id AS user_id_e,
event_type as event_type_e
FROM
events_table
) AS ma_e
FROM (
(SELECT user_id AS user_id_e,
event_type AS event_type_e
FROM events_table ) AS ma_e
JOIN
(SELECT
value_2,
(SELECT value_2,
value_3,
user_id
FROM
(SELECT *
FROM
(
FROM (
(SELECT user_id_p AS user_id
FROM
(SELECT *
FROM (
(SELECT
user_id AS user_id_p
FROM
(
(SELECT user_id AS user_id_p
FROM events_table
WHERE (event_type IN (1, 2, 3, 4, 5))
) AS ma_p
JOIN
(SELECT user_id AS user_id_a
FROM users_table
WHERE (value_2 % 5 = 1)
) AS a
ON (a.user_id_a = ma_p.user_id_p)
)
) AS a_ma_p
) AS inner_filter_q
events_table
WHERE
(event_type IN (1,2,3,4,5)) ) AS ma_p
JOIN
(SELECT
value_2,
value_3,
user_id AS user_id_ck
FROM events_table
WHERE event_type = ANY(ARRAY [10, 11, 12])
user_id AS user_id_a
FROM
users_table
WHERE
(value_2 % 5 = 1) ) AS a
ON (a.user_id_a = ma_p.user_id_p) ) ) AS a_ma_p ) AS inner_filter_q
JOIN
(SELECT
value_2, value_3, user_id AS user_id_ck
FROM
events_table
WHERE
event_type = ANY(ARRAY [10, 11, 12])
ORDER BY
value_3 ASC,
user_id_ck DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10
) AS ma_ck
ON (ma_ck.user_id_ck = inner_filter_q.user_id)
) AS inner_sub_q
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10 )
AS ma_ck ON (ma_ck.user_id_ck = inner_filter_q.user_id) )
AS inner_sub_q
ORDER BY
value_3 ASC,
user_id_ck DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10
) AS outer_sub_q
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10 )
AS outer_sub_q
ORDER BY
value_3 ASC,
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10) AS inner_search_q
ON (ma_e.user_id_e = inner_search_q.user_id)
) AS outer_inner_sub_q
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10)
AS inner_search_q
ON (ma_e.user_id_e = inner_search_q.user_id) )
AS outer_inner_sub_q
ORDER BY
value_3 ASC,
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
event_type_e DESC
LIMIT 10) AS outer_outer_sub_q
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
LIMIT 10)
AS outer_outer_sub_q
ORDER BY
value_3 ASC,
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
event_type_e DESC
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
LIMIT 10;
-- top level select * is removed now there is
@ -1211,33 +1338,39 @@ SELECT *
FROM
(
(SELECT
user_id AS user_id_e,
event_type as event_type_e
user_id AS user_id_e, event_type as event_type_e
FROM
events_table
) AS ma_e
JOIN
(SELECT
value_2,
value_3,
user_id
value_2, value_3, user_id
FROM
(SELECT *
(SELECT
*
FROM
(
(SELECT user_id_p AS user_id
(SELECT
user_id_p AS user_id
FROM
(SELECT *
(SELECT
*
FROM
(
(SELECT user_id AS user_id_p
FROM events_table
WHERE (event_type IN (1, 2, 3, 4, 5))
(SELECT
user_id AS user_id_p
FROM
events_table
WHERE
(event_type IN (1, 2, 3, 4, 5))
) AS ma_p
JOIN
(SELECT user_id AS user_id_a
FROM users_table
WHERE (value_2 % 5 = 1)
(SELECT
user_id AS user_id_a
FROM
users_table
WHERE
(value_2 % 5 = 1)
) AS a
ON (a.user_id_a = ma_p.user_id_p)
)
@ -1245,37 +1378,28 @@ FROM
) AS inner_filter_q
JOIN
(SELECT
value_2,
value_3,
user_id AS user_id_ck
FROM events_table
WHERE event_type = ANY(ARRAY [10, 11, 12])
value_2, value_3, user_id AS user_id_ck
FROM
events_table
WHERE
event_type = ANY(ARRAY [10, 11, 12])
ORDER BY
value_3 ASC,
user_id_ck DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10
) AS ma_ck
ON (ma_ck.user_id_ck = inner_filter_q.user_id)
) AS inner_sub_q
ORDER BY
value_3 ASC,
user_id_ck DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10
) AS outer_sub_q
ORDER BY
value_3 ASC,
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
LIMIT 10) AS inner_search_q
ON (ma_e.user_id_e = inner_search_q.user_id)
) AS outer_inner_sub_q
ORDER BY
value_3 ASC,
user_id DESC,
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
event_type_e DESC
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
LIMIT 10;
@ -1354,11 +1478,13 @@ SELECT user_id, array_length(events_table, 1)
FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM (
SELECT u.user_id, e.event_type::text AS event, e.time
FROM users_table AS u,
SELECT
u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e
WHERE u.user_id = e.user_id
AND e.event_type IN (100, 101, 102)
WHERE
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t
GROUP BY user_id
) q
@ -1370,11 +1496,13 @@ SELECT user_id, array_length(events_table, 1)
FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM (
SELECT u.user_id, e.event_type::text AS event, e.time
FROM users_table AS u,
SELECT
u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e
WHERE u.user_id = e.user_id
AND e.event_type IN (100, 101, 102)
WHERE
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t
GROUP BY user_id
) q
@ -1392,11 +1520,13 @@ SELECT user_id, array_length(events_table, 1)
FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM (
SELECT u.user_id, e.event_type::text AS event, e.time
FROM users_table AS u,
SELECT
u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e
WHERE u.user_id = e.user_id
AND e.event_type IN (100, 101, 102)
WHERE
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t
GROUP BY user_id
) q
@ -1408,11 +1538,13 @@ SELECT user_id, array_length(events_table, 1)
FROM (
SELECT user_id, array_agg(event ORDER BY time) AS events_table
FROM (
SELECT u.user_id, e.event_type::text AS event, e.time
FROM users_table AS u,
SELECT
u.user_id, e.event_type::text AS event, e.time
FROM
users_table AS u,
events_table AS e
WHERE u.user_id = e.user_id
AND e.event_type IN (100, 101, 102)
WHERE
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
) t
GROUP BY user_id
) q

File diff suppressed because it is too large Load Diff

View File

@ -123,34 +123,40 @@ FROM (
( SELECT user_id,
sum(counter)
FROM
( SELECT user_id,
sum(value_2) AS counter
FROM users_table
GROUP BY user_id
(SELECT
user_id, sum(value_2) AS counter
FROM
users_table
GROUP BY
user_id
UNION
SELECT user_id,
sum(value_2) AS counter
FROM events_table
GROUP BY user_id ) user_id_1
GROUP BY user_id)
SELECT
user_id, sum(value_2) AS counter
FROM
events_table
GROUP BY
user_id) user_id_1
GROUP BY
user_id)
UNION
( SELECT user_id,
sum(counter)
(SELECT
user_id, sum(counter)
FROM
(SELECT
user_id, sum(value_2) AS counter
FROM users_table
GROUP BY user_id
FROM
users_table
GROUP BY
user_id
UNION
SELECT user_id, sum(value_2) AS counter
FROM events_table
GROUP BY user_id) user_id_2
GROUP BY user_id)) AS ftop
SELECT
user_id, sum(value_2) AS counter
FROM
events_table
GROUP BY
user_id) user_id_2
GROUP BY
user_id)) AS ftop
ORDER BY 2 DESC, 1 DESC
LIMIT 5;
@ -159,40 +165,45 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
FROM
( SELECT *, random()
FROM
( SELECT "t"."user_id",
"t"."time",
unnest("t"."collected_events") AS "event_types"
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
FROM
( SELECT "t1"."user_id",
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
FROM (
(SELECT *
FROM
(SELECT "events"."user_id",
"events"."time",
0 AS event
FROM events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1)
(SELECT
"events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1)
UNION
(SELECT *
FROM
(SELECT "events"."user_id", "events"."time", 1 AS event
FROM events_table as "events"
WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
(SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
UNION
(SELECT *
FROM
(SELECT "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events"
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
(SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
UNION
(SELECT *
FROM
(SELECT "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events"
WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1
(SELECT
"events"."user_id", "events"."time", 3 AS event
FROM
events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1
GROUP BY "t1"."user_id") AS t) "q"
) as final_query
GROUP BY types
@ -204,34 +215,39 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
FROM
(SELECT *, random()
FROM
( SELECT "t"."user_id",
"t"."time",
unnest("t"."collected_events") AS "event_types"
(SELECT
"t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
FROM
( SELECT "t1"."user_id",
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
(SELECT
"t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
FROM(
(SELECT "events"."user_id",
"events"."time",
0 AS event
FROM events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15))
(SELECT
"events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15))
UNION
(SELECT "events"."user_id", "events"."time", 1 AS event
FROM events_table as "events"
WHERE event_type IN (15, 16, 17, 18, 19) )
(SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION
(SELECT "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events"
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
(SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION
(SELECT "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events"
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
(SELECT
"events"."user_id", "events"."time", 3 AS event
FROM
events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
GROUP BY "t1"."user_id") AS t) "q"
) as final_query
GROUP BY types
@ -240,35 +256,37 @@ ORDER BY types;
-- again excatly the same query with top level wrapper removed
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
FROM
( SELECT "t"."user_id",
"t"."time",
unnest("t"."collected_events") AS "event_types"
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
FROM
( SELECT "t1"."user_id",
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
FROM (
(SELECT "events"."user_id",
"events"."time",
0 AS event
FROM events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15)
)
(SELECT
"events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15))
UNION
(SELECT "events"."user_id", "events"."time", 1 AS event
FROM events_table as "events"
WHERE event_type IN (15, 16, 17, 18, 19) )
(SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION
(SELECT "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events"
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
(SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION
(SELECT "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events"
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
(SELECT
"events"."user_id", "events"."time", 3 AS event
FROM
events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
GROUP BY "t1"."user_id") AS t) "q"
GROUP BY types
ORDER BY types;
@ -280,60 +298,71 @@ FROM
FROM
( SELECT "t1"."user_id"
FROM (
(SELECT "events"."user_id",
"events"."time",
0 AS event
FROM events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15)
)
(SELECT
"events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15))
UNION
(SELECT "events"."user_id", "events"."time", 1 AS event
FROM events_table as "events"
WHERE event_type IN (15, 16, 17, 18, 19) )
(SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION
(SELECT "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events"
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
(SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION
(SELECT "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events"
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
) AS t) "q" ORDER BY 1 LIMIT 5;
(SELECT
"events"."user_id", "events"."time", 3 AS event
FROM
events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
) AS t) "q"
ORDER BY 1
LIMIT 5;
-- a very similar query UNION ALL
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
FROM
( SELECT "t"."user_id",
"t"."time",
unnest("t"."collected_events") AS "event_types"
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
FROM
( SELECT "t1"."user_id",
min("t1"."time") AS "time",
array_agg(("t1"."event")
ORDER BY TIME ASC, event DESC) AS collected_events
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
FROM (
(SELECT "events"."user_id",
"events"."time",
0 AS event
FROM events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15)
)
(SELECT
"events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15))
UNION ALL
(SELECT "events"."user_id", "events"."time", 1 AS event
FROM events_table as "events"
WHERE event_type IN (15, 16, 17, 18, 19) )
(SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) )
UNION ALL
(SELECT "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events"
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
(SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) )
UNION ALL
(SELECT "events"."user_id", "events"."time", 3 AS event
FROM events_table as "events"
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
(SELECT
"events"."user_id", "events"."time", 3 AS event
FROM
events_table as "events"
WHERE
event_type IN (26, 27, 28, 29, 30, 13))) t1
GROUP BY "t1"."user_id") AS t) "q"
GROUP BY types
ORDER BY types;
@ -535,34 +564,41 @@ FROM (
( SELECT user_id,
sum(counter)
FROM
( SELECT user_id,
sum(value_2) AS counter
FROM users_table
GROUP BY user_id
UNION
SELECT user_id,
sum(value_2) AS counter
FROM events_table
GROUP BY user_id ) user_id_1
GROUP BY user_id)
UNION
( SELECT user_id,
sum(counter)
(SELECT
user_id, sum(value_2) AS counter
FROM
( SELECT sum(value_2) AS counter,
users_table
GROUP BY
user_id
FROM users_table
GROUP BY user_id
UNION
SELECT
user_id, sum(value_2) AS counter
FROM
events_table
GROUP BY
user_id) user_id_1
GROUP BY
user_id)
UNION
(SELECT
user_id, sum(counter)
FROM
(SELECT
sum(value_2) AS counter, user_id
FROM
users_table
GROUP BY
user_id
UNION
SELECT
user_id, sum(value_2) AS counter
FROM
events_table
GROUP BY
user_id) user_id_2
GROUP BY
user_id)) AS ftop;
SELECT user_id,
sum(value_2) AS counter
FROM events_table
GROUP BY user_id) user_id_2
GROUP BY user_id)) AS ftop;
-- some UNION all queries that are going to be pulled up
SELECT
@ -644,31 +680,46 @@ FROM
ORDER BY 1 DESC, 2 DESC
LIMIT 5;
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
FROM
( SELECT "t"."user_id",
"t"."time",
unnest("t"."collected_events") AS "event_types"
( SELECT *, random()
FROM
( SELECT "t1"."user_id",
min("t1"."time") AS "time",
array_agg(("t1"."event") ORDER BY time ASC, event DESC) AS collected_events
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
FROM
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
FROM (
(SELECT "events"."user_id", "events"."time", 0 AS event
FROM events_table as "events"
WHERE event_type IN (10, 11, 12, 13, 14, 15)
)
(SELECT *
FROM
(SELECT
"events"."user_id", "events"."time", 0 AS event
FROM
events_table as "events"
WHERE
event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1)
UNION
(SELECT "events"."user_id", "events"."time", 1 AS event
FROM events_table as "events"
WHERE event_type IN (15, 16, 17, 18, 19) )
(SELECT *
FROM
(SELECT
"events"."user_id", "events"."time", 1 AS event
FROM
events_table as "events"
WHERE
event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
UNION
(SELECT "events"."user_id", "events"."time", 2 AS event
FROM events_table as "events"
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
(SELECT *
FROM
(SELECT
"events"."user_id", "events"."time", 2 AS event
FROM
events_table as "events"
WHERE
event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
UNION
(SELECT 1, now(), 3 AS event)) t1
(SELECT *
FROM
(SELECT 1, now(), 3 AS event) events_subquery_4)) t1
GROUP BY "t1"."user_id") AS t) "q"
) as final_query
GROUP BY types
ORDER BY types;