mirror of https://github.com/citusdata/citus.git
Better format subquery regression tests (#1340)
* 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 * Enable the tests that are temporarily commented This commit enables some of the regression tests that were commented out until all the development is done.pull/1347/head
parent
b686149a8c
commit
5c70b6cd26
|
@ -382,7 +382,12 @@ ORDER BY
|
||||||
(
|
(
|
||||||
SELECT
|
SELECT
|
||||||
users_table.user_id,
|
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
|
events_table.time
|
||||||
FROM
|
FROM
|
||||||
users_table,
|
users_table,
|
||||||
|
@ -557,7 +562,7 @@ HINT: Consider joining tables on partition column and have equal filter on join
|
||||||
SELECT user_id, value_2 FROM users_table WHERE
|
SELECT user_id, value_2 FROM users_table WHERE
|
||||||
value_1 > 101 AND value_1 < 110
|
value_1 > 101 AND value_1 < 110
|
||||||
AND value_2 >= 5
|
AND value_2 >= 5
|
||||||
AND EXISTS (SELECT user_id FROM events_table WHERE event_type>101 AND event_type < 110 AND value_3 > 100 AND user_id=users_table.user_id);
|
AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 101 AND event_type < 110 AND value_3 > 100 AND user_id = users_table.user_id);
|
||||||
ERROR: could not run distributed query with join types other than INNER or OUTER JOINS
|
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.
|
HINT: Consider joining tables on partition column and have equal filter on joining columns.
|
||||||
------------------------------------
|
------------------------------------
|
||||||
|
@ -567,7 +572,7 @@ HINT: Consider joining tables on partition column and have equal filter on join
|
||||||
SELECT user_id, value_2 FROM users_table WHERE
|
SELECT user_id, value_2 FROM users_table WHERE
|
||||||
value_1 = 101
|
value_1 = 101
|
||||||
AND value_2 >= 5
|
AND value_2 >= 5
|
||||||
AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type=101 AND value_3 > 100 AND user_id=users_table.user_id);
|
AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type=101 AND value_3 > 100 AND user_id = users_table.user_id);
|
||||||
ERROR: could not run distributed query with subquery outside the FROM clause
|
ERROR: could not run distributed query with subquery outside the FROM clause
|
||||||
HINT: Consider using an equality filter on the distributed table's partition column.
|
HINT: Consider using an equality filter on the distributed table's partition column.
|
||||||
------------------------------------
|
------------------------------------
|
||||||
|
@ -577,8 +582,8 @@ HINT: Consider using an equality filter on the distributed table's partition co
|
||||||
SELECT user_id, value_2 FROM users_table WHERE
|
SELECT user_id, value_2 FROM users_table WHERE
|
||||||
value_1 > 100
|
value_1 > 100
|
||||||
AND value_2 >= 5
|
AND value_2 >= 5
|
||||||
AND EXISTS (SELECT user_id FROM events_table WHERE event_type!=100 AND value_3 > 100 AND user_id=users_table.user_id)
|
AND EXISTS (SELECT user_id FROM events_table WHERE event_type != 100 AND value_3 > 100 AND user_id = users_table.user_id)
|
||||||
AND EXISTS (SELECT user_id FROM events_table WHERE event_type=101 AND value_3 > 100 AND user_id=users_table.user_id);
|
AND EXISTS (SELECT user_id FROM events_table WHERE event_type = 101 AND value_3 > 100 AND user_id = users_table.user_id);
|
||||||
ERROR: could not run distributed query with join types other than INNER or OUTER JOINS
|
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.
|
HINT: Consider joining tables on partition column and have equal filter on joining columns.
|
||||||
------------------------------------
|
------------------------------------
|
||||||
|
@ -587,8 +592,8 @@ HINT: Consider joining tables on partition column and have equal filter on join
|
||||||
------------------------------------
|
------------------------------------
|
||||||
SELECT user_id, value_2 FROM users_table WHERE
|
SELECT user_id, value_2 FROM users_table WHERE
|
||||||
value_2 >= 5
|
value_2 >= 5
|
||||||
AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 100 AND event_type <= 300 AND value_3 > 100 AND user_id=users_table.user_id)
|
AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 100 AND event_type <= 300 AND value_3 > 100 AND user_id = users_table.user_id)
|
||||||
AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type > 300 AND event_type <= 350 AND value_3 > 100 AND user_id=users_table.user_id);
|
AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type > 300 AND event_type <= 350 AND value_3 > 100 AND user_id = users_table.user_id);
|
||||||
ERROR: could not run distributed query with join types other than INNER or OUTER JOINS
|
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.
|
HINT: Consider joining tables on partition column and have equal filter on joining columns.
|
||||||
------------------------------------
|
------------------------------------
|
||||||
|
@ -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
|
||||||
(
|
(
|
||||||
SELECT user_id, value_1 From users_table
|
SELECT
|
||||||
WHERE value_2 > 100 and user_id = 15 GROUP BY value_1, user_id HAVING count(*) > 1
|
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
|
) AS a
|
||||||
ORDER BY user_id ASC, value_1 ASC;
|
ORDER BY
|
||||||
|
user_id ASC, value_1 ASC;
|
||||||
user_id | value_1
|
user_id | value_1
|
||||||
---------+---------
|
---------+---------
|
||||||
15 | 212
|
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
|
-- same query with additional filter to make it not router plannable
|
||||||
SELECT user_id, value_1 from
|
SELECT user_id, value_1 from
|
||||||
(
|
(
|
||||||
SELECT user_id, value_1 From users_table
|
SELECT
|
||||||
WHERE value_2 > 100 and (user_id = 15 OR user_id = 16) GROUP BY value_1, user_id HAVING count(*) > 1
|
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
|
) AS a
|
||||||
ORDER BY user_id ASC, value_1 ASC;
|
ORDER BY
|
||||||
|
user_id ASC, value_1 ASC;
|
||||||
user_id | value_1
|
user_id | value_1
|
||||||
---------+---------
|
---------+---------
|
||||||
15 | 212
|
15 | 212
|
||||||
|
@ -658,12 +676,15 @@ ORDER BY user_id ASC, value_1 ASC;
|
||||||
SELECT user_id
|
SELECT user_id
|
||||||
FROM events_table
|
FROM events_table
|
||||||
WHERE
|
WHERE
|
||||||
event_type = 16 AND value_2 > 50
|
event_type = 16 AND value_2 > 50 AND
|
||||||
AND user_id IN
|
user_id IN
|
||||||
(SELECT user_id
|
(SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
|
FROM
|
||||||
|
users_table
|
||||||
WHERE
|
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
|
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.
|
HINT: Consider joining tables on partition column and have equal filter on joining columns.
|
||||||
------------------------------------
|
------------------------------------
|
||||||
|
@ -684,10 +705,15 @@ SELECT user_id FROM
|
||||||
user_id
|
user_id
|
||||||
FROM
|
FROM
|
||||||
events_table
|
events_table
|
||||||
WHERE event_type = 901
|
WHERE
|
||||||
GROUP BY user_id HAVING count(*) > 3
|
event_type = 901
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(*) > 3
|
||||||
) AS a
|
) AS a
|
||||||
ORDER BY user_id;
|
ORDER BY
|
||||||
|
user_id;
|
||||||
user_id
|
user_id
|
||||||
---------
|
---------
|
||||||
57
|
57
|
||||||
|
@ -710,7 +736,8 @@ FROM
|
||||||
short_list.user_id = ma.user_id and ma.value_1 < 50 and short_list.event_type < 50
|
short_list.user_id = ma.user_id and ma.value_1 < 50 and short_list.event_type < 50
|
||||||
) temp
|
) temp
|
||||||
ON users_table.user_id = temp.user_id
|
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
|
-- get some statistics from the aggregated results to ensure the results are correct
|
||||||
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM assets;
|
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM assets;
|
||||||
count | count | avg
|
count | count | avg
|
||||||
|
@ -723,13 +750,17 @@ DROP TABLE assets;
|
||||||
-- original query that fails
|
-- original query that fails
|
||||||
SELECT count(*) FROM
|
SELECT count(*) FROM
|
||||||
(
|
(
|
||||||
SELECT user_id
|
SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
WHERE (value_1 = '5'
|
FROM
|
||||||
OR value_1 = '13')
|
users_table
|
||||||
AND user_id NOT IN (select user_id from users_table where value_1 = '3')
|
WHERE
|
||||||
GROUP BY user_id
|
(value_1 = '5' OR value_1 = '13') AND
|
||||||
HAVING count(distinct value_1) = 2
|
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;
|
) as foo;
|
||||||
ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys
|
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.
|
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
|
users_table
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 = '5' OR value_1 = '13')
|
(value_1 = '5' OR value_1 = '13')
|
||||||
GROUP BY user_id
|
GROUP BY
|
||||||
HAVING count(distinct value_1) = 2) as a
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) = 2) as a
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
user_id
|
user_id
|
||||||
|
@ -751,8 +784,14 @@ SELECT subquery_count FROM
|
||||||
users_table
|
users_table
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 = '3')
|
(value_1 = '3')
|
||||||
GROUP BY user_id) as b on a.user_id = b.user_id WHERE b.user_id IS NULL
|
GROUP BY
|
||||||
GROUP BY a.user_id) AS inner_subquery;
|
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
|
subquery_count
|
||||||
----------------
|
----------------
|
||||||
1
|
1
|
||||||
|
@ -767,8 +806,10 @@ FROM (
|
||||||
users_table
|
users_table
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 = '5' OR value_1 = '13')
|
(value_1 = '5' OR value_1 = '13')
|
||||||
GROUP BY user_id
|
GROUP BY
|
||||||
HAVING count(distinct value_1) = 2
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) = 2
|
||||||
) as a
|
) as a
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -777,10 +818,13 @@ FROM (
|
||||||
users_table
|
users_table
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 = '3')
|
(value_1 = '3')
|
||||||
GROUP BY user_id) AS b
|
GROUP BY
|
||||||
|
user_id) AS b
|
||||||
ON a.user_id = b.user_id
|
ON a.user_id = b.user_id
|
||||||
WHERE b.user_id IS NULL
|
WHERE
|
||||||
GROUP BY a.user_id;
|
b.user_id IS NULL
|
||||||
|
GROUP BY
|
||||||
|
a.user_id;
|
||||||
subquery_count
|
subquery_count
|
||||||
----------------
|
----------------
|
||||||
1
|
1
|
||||||
|
@ -849,9 +893,11 @@ FROM (
|
||||||
ORDER BY time
|
ORDER BY time
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
) e5 ON true
|
) e5 ON true
|
||||||
where e1.user_id = 1
|
WHERE
|
||||||
group by e1.user_id
|
e1.user_id = 1
|
||||||
limit 1;
|
GROUP BY
|
||||||
|
e1.user_id
|
||||||
|
LIMIT 1;
|
||||||
user_id | viewed_homepage | use_demo | entered_credit_card | submit_card_info | see_bought_screen
|
user_id | viewed_homepage | use_demo | entered_credit_card | submit_card_info | see_bought_screen
|
||||||
---------+-----------------+----------+---------------------+------------------+-------------------
|
---------+-----------------+----------+---------------------+------------------+-------------------
|
||||||
1 | 1 | | | |
|
1 | 1 | | | |
|
||||||
|
@ -1021,8 +1067,10 @@ FROM (
|
||||||
users_table
|
users_table
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 > 5)
|
(value_1 > 5)
|
||||||
GROUP BY user_id
|
GROUP BY
|
||||||
HAVING count(distinct value_1) > 88
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) > 88
|
||||||
) as a
|
) as a
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -1032,9 +1080,12 @@ FROM (
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 > 3)) AS b
|
(value_1 > 3)) AS b
|
||||||
ON a.user_id = b.user_id
|
ON a.user_id = b.user_id
|
||||||
WHERE b.user_id IS NOT NULL
|
WHERE
|
||||||
GROUP BY a.user_id
|
b.user_id IS NOT NULL
|
||||||
ORDER BY avg(b.value_3), 2, 1
|
GROUP BY
|
||||||
|
a.user_id
|
||||||
|
ORDER BY
|
||||||
|
avg(b.value_3), 2, 1
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
user_id | subquery_avg
|
user_id | subquery_avg
|
||||||
---------+----------------------
|
---------+----------------------
|
||||||
|
@ -1045,7 +1096,7 @@ LIMIT 5;
|
||||||
77 | 449.9313725490196078
|
77 | 449.9313725490196078
|
||||||
(5 rows)
|
(5 rows)
|
||||||
|
|
||||||
-- add having
|
-- add having to the same query
|
||||||
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
||||||
FROM (
|
FROM (
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -1065,10 +1116,14 @@ FROM (
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 > 3)) AS b
|
(value_1 > 3)) AS b
|
||||||
ON a.user_id = b.user_id
|
ON a.user_id = b.user_id
|
||||||
WHERE b.user_id IS NOT NULL
|
WHERE
|
||||||
GROUP BY a.user_id
|
b.user_id IS NOT NULL
|
||||||
HAVING sum(b.value_3) > 50000
|
GROUP BY
|
||||||
ORDER BY avg(b.value_3), 2, 1
|
a.user_id
|
||||||
|
HAVING
|
||||||
|
sum(b.value_3) > 50000
|
||||||
|
ORDER BY
|
||||||
|
avg(b.value_3), 2, 1
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
user_id | subquery_avg
|
user_id | subquery_avg
|
||||||
---------+----------------------
|
---------+----------------------
|
||||||
|
@ -1082,21 +1137,33 @@ LIMIT 5;
|
||||||
-- avg on the value_3 is not a resjunk
|
-- avg on the value_3 is not a resjunk
|
||||||
SELECT a.user_id, avg(b.value_2) as subquery_avg, avg(b.value_3)
|
SELECT a.user_id, avg(b.value_2) as subquery_avg, avg(b.value_3)
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id
|
(SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
WHERE (value_1 > 5)
|
FROM
|
||||||
GROUP BY user_id
|
users_table
|
||||||
HAVING count(distinct value_1) > 88
|
WHERE
|
||||||
|
(value_1 > 5)
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) > 88
|
||||||
) as a
|
) as a
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
(SELECT user_id, value_2, value_3
|
(
|
||||||
FROM users_table
|
SELECT
|
||||||
WHERE (value_1 > 3)
|
user_id, value_2, value_3
|
||||||
|
FROM
|
||||||
|
users_table
|
||||||
|
WHERE
|
||||||
|
(value_1 > 3)
|
||||||
) AS b
|
) AS b
|
||||||
ON a.user_id = b.user_id
|
ON a.user_id = b.user_id
|
||||||
WHERE b.user_id IS NOT NULL
|
WHERE
|
||||||
GROUP BY a.user_id
|
b.user_id IS NOT NULL
|
||||||
ORDER BY avg(b.value_3) DESC, 2, 1
|
GROUP BY
|
||||||
|
a.user_id
|
||||||
|
ORDER BY
|
||||||
|
avg(b.value_3) DESC, 2, 1
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
user_id | subquery_avg | avg
|
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
|
FROM
|
||||||
users_table u
|
users_table u
|
||||||
LEFT OUTER JOIN LATERAL
|
LEFT OUTER JOIN LATERAL
|
||||||
(SELECT *
|
(SELECT
|
||||||
FROM events_table e1
|
*
|
||||||
WHERE e1.user_id = u.user_id
|
FROM
|
||||||
ORDER BY e1.value_3 DESC
|
events_table e1
|
||||||
|
WHERE
|
||||||
|
e1.user_id = u.user_id
|
||||||
|
ORDER BY
|
||||||
|
e1.value_3 DESC
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
) sub
|
) sub
|
||||||
ON true
|
ON true
|
||||||
LEFT OUTER JOIN events_table e2
|
LEFT OUTER JOIN events_table e2
|
||||||
ON e2.user_id = sub.user_id
|
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
|
WHERE
|
||||||
GROUP BY u.user_id, sub.value_2, sub.value_3
|
e2.value_2 > 10 AND e2.value_2 < 50 AND u.value_2 > 10 AND u.value_2 < 50
|
||||||
ORDER BY 4 DESC, 1 DESC, 2 ASC, 3 ASC
|
GROUP BY
|
||||||
|
u.user_id, sub.value_2, sub.value_3
|
||||||
|
ORDER BY
|
||||||
|
4 DESC, 1 DESC, 2 ASC, 3 ASC
|
||||||
LIMIT 10;
|
LIMIT 10;
|
||||||
user_id | value_2 | value_3 | counts
|
user_id | value_2 | value_3 | counts
|
||||||
---------+---------+---------+--------
|
---------+---------+---------+--------
|
||||||
|
@ -1146,12 +1220,16 @@ SELECT
|
||||||
count(*) as users_count
|
count(*) as users_count
|
||||||
FROM events_table
|
FROM events_table
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT DISTINCT user_id
|
(SELECT
|
||||||
FROM users_table
|
DISTINCT user_id
|
||||||
|
FROM
|
||||||
|
users_table
|
||||||
) as distinct_users
|
) as distinct_users
|
||||||
ON distinct_users.user_id = events_table.user_id
|
ON distinct_users.user_id = events_table.user_id
|
||||||
GROUP BY distinct_users.user_id
|
GROUP BY
|
||||||
ORDER BY users_count desc, avg_type DESC
|
distinct_users.user_id
|
||||||
|
ORDER BY
|
||||||
|
users_count desc, avg_type DESC
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
avg_type | users_count
|
avg_type | users_count
|
||||||
----------------------+-------------
|
----------------------+-------------
|
||||||
|
@ -1170,13 +1248,17 @@ FROM events_table
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT distinct_users.user_id, count(1) as ct
|
(SELECT distinct_users.user_id, count(1) as ct
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id
|
(SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
|
FROM
|
||||||
|
users_table
|
||||||
) as distinct_users
|
) as distinct_users
|
||||||
GROUP BY distinct_users.user_id
|
GROUP BY
|
||||||
|
distinct_users.user_id
|
||||||
) as users_count
|
) as users_count
|
||||||
ON users_count.user_id = events_table.user_id
|
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;
|
LIMIT 5;
|
||||||
event_type | ct
|
event_type | ct
|
||||||
------------+-----
|
------------+-----
|
||||||
|
@ -1190,17 +1272,25 @@ LIMIT 5;
|
||||||
--- now, test (subquery JOIN subquery)
|
--- now, test (subquery JOIN subquery)
|
||||||
SELECT n1.user_id, count_1, total_count
|
SELECT n1.user_id, count_1, total_count
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id, count(1) as count_1
|
(SELECT
|
||||||
FROM users_table
|
user_id, count(1) as count_1
|
||||||
GROUP BY user_id
|
FROM
|
||||||
|
users_table
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
) n1
|
) n1
|
||||||
INNER JOIN
|
INNER JOIN
|
||||||
(SELECT user_id, count(1) as total_count
|
(
|
||||||
FROM events_table
|
SELECT
|
||||||
GROUP BY user_id, event_type
|
user_id, count(1) as total_count
|
||||||
|
FROM
|
||||||
|
events_table
|
||||||
|
GROUP BY
|
||||||
|
user_id, event_type
|
||||||
) n2
|
) n2
|
||||||
ON (n2.user_id = n1.user_id)
|
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;
|
LIMIT 10;
|
||||||
user_id | count_1 | total_count
|
user_id | count_1 | total_count
|
||||||
---------+---------+-------------
|
---------+---------+-------------
|
||||||
|
@ -1218,17 +1308,26 @@ LIMIT 10;
|
||||||
|
|
||||||
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id
|
(SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
WHERE (value_1 > 5)
|
FROM
|
||||||
GROUP BY user_id
|
users_table
|
||||||
HAVING count(distinct value_1) > 88
|
WHERE
|
||||||
|
(value_1 > 5)
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) > 88
|
||||||
) as a
|
) as a
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
(SELECT DISTINCT ON (user_id) user_id, value_2, value_3
|
(SELECT
|
||||||
FROM users_table
|
DISTINCT ON (user_id) user_id, value_2, value_3
|
||||||
WHERE (value_1 > 3)
|
FROM
|
||||||
ORDER BY 1,2,3
|
users_table
|
||||||
|
WHERE
|
||||||
|
(value_1 > 3)
|
||||||
|
ORDER BY
|
||||||
|
1,2,3
|
||||||
) AS b
|
) AS b
|
||||||
ON a.user_id = b.user_id
|
ON a.user_id = b.user_id
|
||||||
WHERE b.user_id IS NOT NULL
|
WHERE b.user_id IS NOT NULL
|
||||||
|
@ -1248,17 +1347,26 @@ LIMIT 5;
|
||||||
-- when used in target list
|
-- when used in target list
|
||||||
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id
|
(SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
WHERE (value_1 > 5)
|
FROM
|
||||||
GROUP BY user_id
|
users_table
|
||||||
HAVING count(distinct value_1) > 88
|
WHERE
|
||||||
|
(value_1 > 5)
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) > 88
|
||||||
) as a
|
) as a
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
(SELECT DISTINCT ON (value_2) value_2 , user_id, value_3
|
(SELECT
|
||||||
FROM users_table
|
DISTINCT ON (value_2) value_2 , user_id, value_3
|
||||||
WHERE (value_1 > 3)
|
FROM
|
||||||
ORDER BY 1,2,3
|
users_table
|
||||||
|
WHERE
|
||||||
|
(value_1 > 3)
|
||||||
|
ORDER BY
|
||||||
|
1,2,3
|
||||||
) AS b
|
) AS b
|
||||||
USING (user_id)
|
USING (user_id)
|
||||||
GROUP BY 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
|
DETAIL: Distinct on columns without partition column is currently unsupported
|
||||||
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id
|
(SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
WHERE (value_1 > 5)
|
FROM
|
||||||
GROUP BY user_id
|
users_table
|
||||||
HAVING count(distinct value_1) > 88
|
WHERE
|
||||||
|
(value_1 > 5)
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) > 88
|
||||||
) as a
|
) as a
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
(SELECT DISTINCT ON (value_2, user_id) value_2 , user_id, value_3
|
(SELECT
|
||||||
FROM users_table
|
DISTINCT ON (value_2, user_id) value_2 , user_id, value_3
|
||||||
WHERE (value_1 > 3)
|
FROM
|
||||||
ORDER BY 1,2,3
|
users_table
|
||||||
|
WHERE
|
||||||
|
(value_1 > 3)
|
||||||
|
ORDER BY
|
||||||
|
1,2,3
|
||||||
) AS b
|
) AS b
|
||||||
ON a.user_id = b.user_id
|
ON a.user_id = b.user_id
|
||||||
WHERE b.user_id IS NOT NULL
|
WHERE
|
||||||
GROUP BY a.user_id
|
b.user_id IS NOT NULL
|
||||||
ORDER BY avg(b.value_3), 2, 1
|
GROUP BY
|
||||||
|
a.user_id
|
||||||
|
ORDER BY
|
||||||
|
avg(b.value_3), 2, 1
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
user_id | subquery_avg
|
user_id | subquery_avg
|
||||||
---------+----------------------
|
---------+----------------------
|
||||||
|
@ -1297,22 +1417,30 @@ FROM
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
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
|
JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
ma.user_id AS user_id, ma.value_2 AS value_2,
|
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
|
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
|
||||||
FROM users_table AS ma
|
FROM
|
||||||
WHERE (ma.value_2 > 100)
|
users_table AS ma
|
||||||
ORDER BY prob DESC, user_id DESC
|
WHERE
|
||||||
|
(ma.value_2 > 100)
|
||||||
|
ORDER BY
|
||||||
|
prob DESC, user_id DESC
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
) AS ma
|
) AS ma
|
||||||
ON (a.a_user_id = ma.user_id)
|
ON (a.a_user_id = ma.user_id)
|
||||||
) AS inner_sub
|
) AS inner_sub
|
||||||
ORDER BY prob DESC, user_id DESC
|
ORDER BY
|
||||||
|
prob DESC, user_id DESC
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
) AS outer_sub
|
) 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;
|
LIMIT 10;
|
||||||
user_id | event_type
|
user_id | event_type
|
||||||
---------+------------
|
---------+------------
|
||||||
|
@ -1332,18 +1460,25 @@ LIMIT 10;
|
||||||
-- ordering difference in the previous one's inner query
|
-- ordering difference in the previous one's inner query
|
||||||
SELECT user_id, event_type
|
SELECT user_id, event_type
|
||||||
FROM
|
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
|
JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
ma.user_id AS user_id, ma.value_2 AS value_2,
|
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
|
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
|
||||||
FROM users_table AS ma
|
FROM
|
||||||
WHERE (ma.value_2 > 100)
|
users_table AS ma
|
||||||
ORDER BY prob DESC, user_id DESC
|
WHERE
|
||||||
|
(ma.value_2 > 100)
|
||||||
|
ORDER BY
|
||||||
|
prob DESC, user_id DESC
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
) AS ma
|
) AS ma
|
||||||
ON (a.a_user_id = ma.user_id)
|
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;
|
LIMIT 10;
|
||||||
user_id | event_type
|
user_id | event_type
|
||||||
---------+------------
|
---------+------------
|
||||||
|
@ -1365,22 +1500,31 @@ FROM
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
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
|
JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
ma.user_id AS user_id, ma.value_2 AS value_2,
|
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
|
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
|
||||||
FROM users_table AS ma
|
FROM
|
||||||
WHERE (ma.value_2 > 100)
|
users_table AS ma
|
||||||
ORDER BY prob DESC, user_id DESC
|
WHERE
|
||||||
|
(ma.value_2 > 100)
|
||||||
|
ORDER BY
|
||||||
|
prob DESC, user_id DESC
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
) AS ma
|
) AS ma
|
||||||
ON (a.a_user_id = ma.user_id)
|
ON (a.a_user_id = ma.user_id)
|
||||||
) AS inner_sub
|
) 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
|
LIMIT 10
|
||||||
) AS outer_sub
|
) 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;
|
LIMIT 10;
|
||||||
user_id | event_type
|
user_id | event_type
|
||||||
---------+------------
|
---------+------------
|
||||||
|
@ -1423,80 +1567,63 @@ CREATE OR REPLACE FUNCTION array_index(ANYARRAY, ANYELEMENT)
|
||||||
SELECT *
|
SELECT *
|
||||||
FROM
|
FROM
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
FROM (
|
||||||
(
|
(SELECT user_id AS user_id_e,
|
||||||
(SELECT
|
event_type AS event_type_e
|
||||||
user_id AS user_id_e,
|
FROM events_table ) AS ma_e
|
||||||
event_type as event_type_e
|
|
||||||
FROM
|
|
||||||
events_table
|
|
||||||
) AS ma_e
|
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT
|
(SELECT value_2,
|
||||||
value_2,
|
|
||||||
value_3,
|
value_3,
|
||||||
user_id
|
user_id
|
||||||
FROM
|
FROM
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
FROM (
|
||||||
(
|
|
||||||
(SELECT user_id_p AS user_id
|
(SELECT user_id_p AS user_id
|
||||||
FROM
|
FROM
|
||||||
(SELECT *
|
(SELECT *
|
||||||
|
FROM (
|
||||||
|
(SELECT
|
||||||
|
user_id AS user_id_p
|
||||||
FROM
|
FROM
|
||||||
(
|
events_table
|
||||||
(SELECT user_id AS user_id_p
|
WHERE
|
||||||
FROM events_table
|
(event_type IN (1,2,3,4,5)) ) AS ma_p
|
||||||
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
|
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
value_2,
|
user_id AS user_id_a
|
||||||
value_3,
|
FROM
|
||||||
user_id AS user_id_ck
|
users_table
|
||||||
FROM events_table
|
WHERE
|
||||||
WHERE event_type = ANY(ARRAY [10, 11, 12])
|
(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
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
||||||
user_id_ck DESC,
|
LIMIT 10 )
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
AS ma_ck ON (ma_ck.user_id_ck = inner_filter_q.user_id) )
|
||||||
LIMIT 10
|
AS inner_sub_q
|
||||||
) AS ma_ck
|
|
||||||
ON (ma_ck.user_id_ck = inner_filter_q.user_id)
|
|
||||||
) AS inner_sub_q
|
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
||||||
user_id_ck DESC,
|
LIMIT 10 )
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
AS outer_sub_q
|
||||||
LIMIT 10
|
|
||||||
) AS outer_sub_q
|
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
||||||
user_id DESC,
|
LIMIT 10)
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
AS inner_search_q
|
||||||
LIMIT 10) AS inner_search_q
|
ON (ma_e.user_id_e = inner_search_q.user_id) )
|
||||||
ON (ma_e.user_id_e = inner_search_q.user_id)
|
AS outer_inner_sub_q
|
||||||
) AS outer_inner_sub_q
|
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
|
||||||
user_id DESC,
|
LIMIT 10)
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
|
AS outer_outer_sub_q
|
||||||
event_type_e DESC
|
|
||||||
LIMIT 10) AS outer_outer_sub_q
|
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
|
||||||
user_id DESC,
|
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
|
|
||||||
event_type_e DESC
|
|
||||||
LIMIT 10;
|
LIMIT 10;
|
||||||
user_id_e | event_type_e | value_2 | value_3 | user_id
|
user_id_e | event_type_e | value_2 | value_3 | user_id
|
||||||
-----------+--------------+---------+---------+---------
|
-----------+--------------+---------+---------+---------
|
||||||
|
@ -1518,33 +1645,39 @@ SELECT *
|
||||||
FROM
|
FROM
|
||||||
(
|
(
|
||||||
(SELECT
|
(SELECT
|
||||||
user_id AS user_id_e,
|
user_id AS user_id_e, event_type as event_type_e
|
||||||
event_type as event_type_e
|
|
||||||
FROM
|
FROM
|
||||||
events_table
|
events_table
|
||||||
) AS ma_e
|
) AS ma_e
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
value_2,
|
value_2, value_3, user_id
|
||||||
value_3,
|
|
||||||
user_id
|
|
||||||
FROM
|
FROM
|
||||||
(SELECT *
|
(SELECT
|
||||||
|
*
|
||||||
FROM
|
FROM
|
||||||
(
|
(
|
||||||
(SELECT user_id_p AS user_id
|
(SELECT
|
||||||
|
user_id_p AS user_id
|
||||||
FROM
|
FROM
|
||||||
(SELECT *
|
(SELECT
|
||||||
|
*
|
||||||
FROM
|
FROM
|
||||||
(
|
(
|
||||||
(SELECT user_id AS user_id_p
|
(SELECT
|
||||||
FROM events_table
|
user_id AS user_id_p
|
||||||
WHERE (event_type IN (1, 2, 3, 4, 5))
|
FROM
|
||||||
|
events_table
|
||||||
|
WHERE
|
||||||
|
(event_type IN (1, 2, 3, 4, 5))
|
||||||
) AS ma_p
|
) AS ma_p
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT user_id AS user_id_a
|
(SELECT
|
||||||
FROM users_table
|
user_id AS user_id_a
|
||||||
WHERE (value_2 % 5 = 1)
|
FROM
|
||||||
|
users_table
|
||||||
|
WHERE
|
||||||
|
(value_2 % 5 = 1)
|
||||||
) AS a
|
) AS a
|
||||||
ON (a.user_id_a = ma_p.user_id_p)
|
ON (a.user_id_a = ma_p.user_id_p)
|
||||||
)
|
)
|
||||||
|
@ -1552,37 +1685,28 @@ FROM
|
||||||
) AS inner_filter_q
|
) AS inner_filter_q
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
value_2,
|
value_2, value_3, user_id AS user_id_ck
|
||||||
value_3,
|
FROM
|
||||||
user_id AS user_id_ck
|
events_table
|
||||||
FROM events_table
|
WHERE
|
||||||
WHERE event_type = ANY(ARRAY [10, 11, 12])
|
event_type = ANY(ARRAY [10, 11, 12])
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
||||||
user_id_ck DESC,
|
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
) AS ma_ck
|
) AS ma_ck
|
||||||
ON (ma_ck.user_id_ck = inner_filter_q.user_id)
|
ON (ma_ck.user_id_ck = inner_filter_q.user_id)
|
||||||
) AS inner_sub_q
|
) AS inner_sub_q
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
||||||
user_id_ck DESC,
|
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
) AS outer_sub_q
|
) AS outer_sub_q
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
||||||
user_id DESC,
|
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
|
||||||
LIMIT 10) AS inner_search_q
|
LIMIT 10) AS inner_search_q
|
||||||
ON (ma_e.user_id_e = inner_search_q.user_id)
|
ON (ma_e.user_id_e = inner_search_q.user_id)
|
||||||
) AS outer_inner_sub_q
|
) AS outer_inner_sub_q
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
|
||||||
user_id DESC,
|
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
|
|
||||||
event_type_e DESC
|
|
||||||
LIMIT 10;
|
LIMIT 10;
|
||||||
user_id_e | event_type_e | value_2 | value_3 | user_id
|
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 (
|
FROM (
|
||||||
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
||||||
FROM (
|
FROM (
|
||||||
SELECT u.user_id, e.event_type::text AS event, e.time
|
SELECT
|
||||||
FROM users_table AS u,
|
u.user_id, e.event_type::text AS event, e.time
|
||||||
|
FROM
|
||||||
|
users_table AS u,
|
||||||
events_table AS e
|
events_table AS e
|
||||||
WHERE u.user_id = e.user_id
|
WHERE
|
||||||
AND e.event_type IN (100, 101, 102)
|
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
|
||||||
) t
|
) t
|
||||||
GROUP BY user_id
|
GROUP BY user_id
|
||||||
) q
|
) q
|
||||||
|
@ -1705,11 +1831,13 @@ SELECT user_id, array_length(events_table, 1)
|
||||||
FROM (
|
FROM (
|
||||||
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
||||||
FROM (
|
FROM (
|
||||||
SELECT u.user_id, e.event_type::text AS event, e.time
|
SELECT
|
||||||
FROM users_table AS u,
|
u.user_id, e.event_type::text AS event, e.time
|
||||||
|
FROM
|
||||||
|
users_table AS u,
|
||||||
events_table AS e
|
events_table AS e
|
||||||
WHERE u.user_id = e.user_id
|
WHERE
|
||||||
AND e.event_type IN (100, 101, 102)
|
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
|
||||||
) t
|
) t
|
||||||
GROUP BY user_id
|
GROUP BY user_id
|
||||||
) q
|
) q
|
||||||
|
@ -1731,11 +1859,13 @@ SELECT user_id, array_length(events_table, 1)
|
||||||
FROM (
|
FROM (
|
||||||
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
||||||
FROM (
|
FROM (
|
||||||
SELECT u.user_id, e.event_type::text AS event, e.time
|
SELECT
|
||||||
FROM users_table AS u,
|
u.user_id, e.event_type::text AS event, e.time
|
||||||
|
FROM
|
||||||
|
users_table AS u,
|
||||||
events_table AS e
|
events_table AS e
|
||||||
WHERE u.user_id = e.user_id
|
WHERE
|
||||||
AND e.event_type IN (100, 101, 102)
|
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
|
||||||
) t
|
) t
|
||||||
GROUP BY user_id
|
GROUP BY user_id
|
||||||
) q
|
) q
|
||||||
|
@ -1757,11 +1887,13 @@ SELECT user_id, array_length(events_table, 1)
|
||||||
FROM (
|
FROM (
|
||||||
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
||||||
FROM (
|
FROM (
|
||||||
SELECT u.user_id, e.event_type::text AS event, e.time
|
SELECT
|
||||||
FROM users_table AS u,
|
u.user_id, e.event_type::text AS event, e.time
|
||||||
|
FROM
|
||||||
|
users_table AS u,
|
||||||
events_table AS e
|
events_table AS e
|
||||||
WHERE u.user_id = e.user_id
|
WHERE
|
||||||
AND e.event_type IN (100, 101, 102)
|
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
|
||||||
) t
|
) t
|
||||||
GROUP BY user_id
|
GROUP BY user_id
|
||||||
) q
|
) q
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -191,32 +191,40 @@ FROM (
|
||||||
( SELECT user_id,
|
( SELECT user_id,
|
||||||
sum(counter)
|
sum(counter)
|
||||||
FROM
|
FROM
|
||||||
( SELECT user_id,
|
(SELECT
|
||||||
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)
|
|
||||||
FROM
|
|
||||||
( SELECT
|
|
||||||
user_id, sum(value_2) AS counter
|
user_id, sum(value_2) AS counter
|
||||||
FROM users_table
|
FROM
|
||||||
GROUP BY user_id
|
users_table
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
UNION
|
UNION
|
||||||
SELECT user_id, sum(value_2) AS counter
|
SELECT
|
||||||
|
user_id, sum(value_2) AS counter
|
||||||
FROM events_table
|
FROM
|
||||||
GROUP BY user_id) user_id_2
|
events_table
|
||||||
GROUP BY user_id)) AS ftop
|
GROUP BY
|
||||||
|
user_id) user_id_1
|
||||||
|
GROUP BY
|
||||||
|
user_id)
|
||||||
|
UNION
|
||||||
|
(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_2
|
||||||
|
GROUP BY
|
||||||
|
user_id)) AS ftop
|
||||||
ORDER BY 2 DESC, 1 DESC
|
ORDER BY 2 DESC, 1 DESC
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
user_id | sum
|
user_id | sum
|
||||||
|
@ -233,40 +241,45 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
|
||||||
FROM
|
FROM
|
||||||
( SELECT *, random()
|
( SELECT *, random()
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t"."user_id",
|
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
|
||||||
"t"."time",
|
|
||||||
unnest("t"."collected_events") AS "event_types"
|
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t1"."user_id",
|
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
|
||||||
min("t1"."time") AS "time",
|
|
||||||
array_agg(("t1"."event")
|
|
||||||
ORDER BY TIME ASC, event DESC) AS collected_events
|
|
||||||
FROM (
|
FROM (
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
FROM
|
||||||
(SELECT "events"."user_id",
|
(SELECT
|
||||||
"events"."time",
|
"events"."user_id", "events"."time", 0 AS event
|
||||||
0 AS event
|
FROM
|
||||||
FROM events_table as "events"
|
events_table as "events"
|
||||||
WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1)
|
WHERE
|
||||||
|
event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1)
|
||||||
UNION
|
UNION
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
FROM
|
||||||
(SELECT "events"."user_id", "events"."time", 1 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 1 AS event
|
||||||
WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
|
FROM
|
||||||
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
|
||||||
UNION
|
UNION
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
FROM
|
||||||
(SELECT "events"."user_id", "events"."time", 2 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 2 AS event
|
||||||
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
|
FROM
|
||||||
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
|
||||||
UNION
|
UNION
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
FROM
|
||||||
(SELECT "events"."user_id", "events"."time", 3 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 3 AS event
|
||||||
WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1
|
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"
|
GROUP BY "t1"."user_id") AS t) "q"
|
||||||
) as final_query
|
) as final_query
|
||||||
GROUP BY types
|
GROUP BY types
|
||||||
|
@ -283,36 +296,41 @@ ORDER BY types;
|
||||||
-- but wrapper unions are removed from the inner part of the query
|
-- but wrapper unions are removed from the inner part of the query
|
||||||
SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
|
SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
|
||||||
FROM
|
FROM
|
||||||
( SELECT *, random()
|
(SELECT *, random()
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t"."user_id",
|
(SELECT
|
||||||
"t"."time",
|
"t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
|
||||||
unnest("t"."collected_events") AS "event_types"
|
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t1"."user_id",
|
(SELECT
|
||||||
min("t1"."time") AS "time",
|
"t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
|
||||||
array_agg(("t1"."event")
|
FROM(
|
||||||
ORDER BY TIME ASC, event DESC) AS collected_events
|
(SELECT
|
||||||
FROM (
|
"events"."user_id", "events"."time", 0 AS event
|
||||||
(SELECT "events"."user_id",
|
FROM
|
||||||
"events"."time",
|
events_table as "events"
|
||||||
0 AS event
|
WHERE
|
||||||
FROM events_table as "events"
|
event_type IN (10, 11, 12, 13, 14, 15))
|
||||||
WHERE event_type IN (10, 11, 12, 13, 14, 15))
|
|
||||||
UNION
|
UNION
|
||||||
(SELECT "events"."user_id", "events"."time", 1 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 1 AS event
|
||||||
WHERE event_type IN (15, 16, 17, 18, 19) )
|
FROM
|
||||||
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (15, 16, 17, 18, 19) )
|
||||||
UNION
|
UNION
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 2 AS event
|
"events"."user_id", "events"."time", 2 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (20, 21, 22, 23, 24, 25) )
|
||||||
UNION
|
UNION
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 3 AS event
|
"events"."user_id", "events"."time", 3 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
|
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 "t1"."user_id") AS t) "q"
|
||||||
) as final_query
|
) as final_query
|
||||||
GROUP BY types
|
GROUP BY types
|
||||||
|
@ -328,35 +346,37 @@ ORDER BY types;
|
||||||
-- again excatly the same query with top level wrapper removed
|
-- again excatly the same query with top level wrapper removed
|
||||||
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
|
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t"."user_id",
|
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
|
||||||
"t"."time",
|
|
||||||
unnest("t"."collected_events") AS "event_types"
|
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t1"."user_id",
|
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
|
||||||
min("t1"."time") AS "time",
|
|
||||||
array_agg(("t1"."event")
|
|
||||||
ORDER BY TIME ASC, event DESC) AS collected_events
|
|
||||||
FROM (
|
FROM (
|
||||||
(SELECT "events"."user_id",
|
(SELECT
|
||||||
"events"."time",
|
"events"."user_id", "events"."time", 0 AS event
|
||||||
0 AS event
|
FROM
|
||||||
FROM events_table as "events"
|
events_table as "events"
|
||||||
WHERE event_type IN (10, 11, 12, 13, 14, 15)
|
WHERE
|
||||||
)
|
event_type IN (10, 11, 12, 13, 14, 15))
|
||||||
UNION
|
UNION
|
||||||
(SELECT "events"."user_id", "events"."time", 1 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 1 AS event
|
||||||
WHERE event_type IN (15, 16, 17, 18, 19) )
|
FROM
|
||||||
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (15, 16, 17, 18, 19) )
|
||||||
UNION
|
UNION
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 2 AS event
|
"events"."user_id", "events"."time", 2 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (20, 21, 22, 23, 24, 25) )
|
||||||
UNION
|
UNION
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 3 AS event
|
"events"."user_id", "events"."time", 3 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
|
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 "t1"."user_id") AS t) "q"
|
||||||
GROUP BY types
|
GROUP BY types
|
||||||
ORDER BY types;
|
ORDER BY types;
|
||||||
|
@ -375,27 +395,36 @@ FROM
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t1"."user_id"
|
( SELECT "t1"."user_id"
|
||||||
FROM (
|
FROM (
|
||||||
(SELECT "events"."user_id",
|
(SELECT
|
||||||
"events"."time",
|
"events"."user_id", "events"."time", 0 AS event
|
||||||
0 AS event
|
FROM
|
||||||
FROM events_table as "events"
|
events_table as "events"
|
||||||
WHERE event_type IN (10, 11, 12, 13, 14, 15)
|
WHERE
|
||||||
)
|
event_type IN (10, 11, 12, 13, 14, 15))
|
||||||
UNION
|
UNION
|
||||||
(SELECT "events"."user_id", "events"."time", 1 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 1 AS event
|
||||||
WHERE event_type IN (15, 16, 17, 18, 19) )
|
FROM
|
||||||
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (15, 16, 17, 18, 19) )
|
||||||
UNION
|
UNION
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 2 AS event
|
"events"."user_id", "events"."time", 2 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (20, 21, 22, 23, 24, 25) )
|
||||||
UNION
|
UNION
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 3 AS event
|
"events"."user_id", "events"."time", 3 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
|
events_table as "events"
|
||||||
) AS t) "q" ORDER BY 1 LIMIT 5;
|
WHERE
|
||||||
|
event_type IN (26, 27, 28, 29, 30, 13))) t1
|
||||||
|
) AS t) "q"
|
||||||
|
ORDER BY 1
|
||||||
|
LIMIT 5;
|
||||||
user_id
|
user_id
|
||||||
---------
|
---------
|
||||||
0
|
0
|
||||||
|
@ -408,35 +437,37 @@ FROM
|
||||||
-- a very similar query UNION ALL
|
-- a very similar query UNION ALL
|
||||||
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
|
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t"."user_id",
|
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
|
||||||
"t"."time",
|
|
||||||
unnest("t"."collected_events") AS "event_types"
|
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t1"."user_id",
|
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
|
||||||
min("t1"."time") AS "time",
|
|
||||||
array_agg(("t1"."event")
|
|
||||||
ORDER BY TIME ASC, event DESC) AS collected_events
|
|
||||||
FROM (
|
FROM (
|
||||||
(SELECT "events"."user_id",
|
(SELECT
|
||||||
"events"."time",
|
"events"."user_id", "events"."time", 0 AS event
|
||||||
0 AS event
|
FROM
|
||||||
FROM events_table as "events"
|
events_table as "events"
|
||||||
WHERE event_type IN (10, 11, 12, 13, 14, 15)
|
WHERE
|
||||||
)
|
event_type IN (10, 11, 12, 13, 14, 15))
|
||||||
UNION ALL
|
UNION ALL
|
||||||
(SELECT "events"."user_id", "events"."time", 1 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 1 AS event
|
||||||
WHERE event_type IN (15, 16, 17, 18, 19) )
|
FROM
|
||||||
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (15, 16, 17, 18, 19) )
|
||||||
UNION ALL
|
UNION ALL
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 2 AS event
|
"events"."user_id", "events"."time", 2 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (20, 21, 22, 23, 24, 25) )
|
||||||
UNION ALL
|
UNION ALL
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 3 AS event
|
"events"."user_id", "events"."time", 3 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
|
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 "t1"."user_id") AS t) "q"
|
||||||
GROUP BY types
|
GROUP BY types
|
||||||
ORDER BY types;
|
ORDER BY types;
|
||||||
|
@ -701,32 +732,40 @@ FROM (
|
||||||
( SELECT user_id,
|
( SELECT user_id,
|
||||||
sum(counter)
|
sum(counter)
|
||||||
FROM
|
FROM
|
||||||
( SELECT user_id,
|
(SELECT
|
||||||
sum(value_2) AS counter
|
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)
|
|
||||||
FROM
|
FROM
|
||||||
( SELECT sum(value_2) AS counter,
|
users_table
|
||||||
|
GROUP BY
|
||||||
user_id
|
user_id
|
||||||
FROM users_table
|
|
||||||
GROUP BY user_id
|
|
||||||
|
|
||||||
UNION
|
UNION
|
||||||
SELECT user_id,
|
SELECT
|
||||||
sum(value_2) AS counter
|
user_id, sum(value_2) AS counter
|
||||||
FROM events_table
|
FROM
|
||||||
GROUP BY user_id) user_id_2
|
events_table
|
||||||
GROUP BY user_id)) AS ftop;
|
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
|
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.
|
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
|
-- some UNION all queries that are going to be pulled up
|
||||||
|
@ -815,31 +854,46 @@ ORDER BY 1 DESC, 2 DESC
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
ERROR: cannot push down this subquery
|
ERROR: cannot push down this subquery
|
||||||
DETAIL: Subqueries without relations are unsupported
|
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
|
FROM
|
||||||
( SELECT "t"."user_id",
|
( SELECT *, random()
|
||||||
"t"."time",
|
|
||||||
unnest("t"."collected_events") AS "event_types"
|
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t1"."user_id",
|
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
|
||||||
min("t1"."time") AS "time",
|
FROM
|
||||||
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 (
|
FROM (
|
||||||
(SELECT "events"."user_id", "events"."time", 0 AS event
|
(SELECT *
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
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)) events_subquery_1)
|
||||||
UNION
|
UNION
|
||||||
(SELECT "events"."user_id", "events"."time", 1 AS event
|
(SELECT *
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
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) ) events_subquery_2)
|
||||||
UNION
|
UNION
|
||||||
(SELECT "events"."user_id", "events"."time", 2 AS event
|
(SELECT *
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
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) ) events_subquery_3)
|
||||||
UNION
|
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"
|
GROUP BY "t1"."user_id") AS t) "q"
|
||||||
|
) as final_query
|
||||||
GROUP BY types
|
GROUP BY types
|
||||||
ORDER BY types;
|
ORDER BY types;
|
||||||
ERROR: cannot push down this subquery
|
ERROR: cannot push down this subquery
|
||||||
|
|
|
@ -170,32 +170,29 @@ FROM
|
||||||
GROUP BY
|
GROUP BY
|
||||||
l_orderkey) AS unit_prices;
|
l_orderkey) AS unit_prices;
|
||||||
|
|
||||||
-- Check that we error out if there is union all.
|
-- Check that we error out if there is non relation subqueries
|
||||||
-- TEMPORARLY DISABLE UNION ALL
|
SELECT count(*) FROM
|
||||||
-- SELECT count(*) FROM
|
(
|
||||||
-- (
|
(SELECT l_orderkey FROM lineitem_subquery) UNION ALL
|
||||||
-- (SELECT l_orderkey FROM lineitem_subquery) UNION ALL
|
(SELECT 1::bigint)
|
||||||
-- (SELECT 1::bigint)
|
) b;
|
||||||
--) b;
|
|
||||||
|
|
||||||
---
|
|
||||||
-- TEMPORARLY DISABLE UNIONS WITHOUT JOINS
|
|
||||||
---
|
|
||||||
-- Check that we error out if queries in union do not include partition columns.
|
-- Check that we error out if queries in union do not include partition columns.
|
||||||
|
|
||||||
--SELECT count(*) FROM
|
SELECT count(*) FROM
|
||||||
--(
|
(
|
||||||
-- (SELECT l_orderkey FROM lineitem_subquery) UNION
|
(SELECT l_orderkey FROM lineitem_subquery) UNION
|
||||||
-- (SELECT l_partkey FROM lineitem_subquery)
|
(SELECT l_partkey FROM lineitem_subquery)
|
||||||
--) b;
|
) b;
|
||||||
|
|
||||||
-- Check that we run union queries if partition column is selected.
|
-- Check that we run union queries if partition column is selected.
|
||||||
|
|
||||||
--SELECT count(*) FROM
|
SELECT count(*) FROM
|
||||||
--(
|
(
|
||||||
-- (SELECT l_orderkey FROM lineitem_subquery) UNION
|
(SELECT l_orderkey FROM lineitem_subquery) UNION
|
||||||
-- (SELECT l_orderkey FROM lineitem_subquery)
|
(SELECT l_orderkey FROM lineitem_subquery)
|
||||||
--) b;
|
) b;
|
||||||
-- Check that we error out if inner query has limit but outer quers has not.
|
-- Check that we error out if inner query has limit but outer quers has not.
|
||||||
SELECT
|
SELECT
|
||||||
avg(o_totalprice/l_quantity)
|
avg(o_totalprice/l_quantity)
|
||||||
|
@ -273,23 +270,23 @@ WHERE
|
||||||
|
|
||||||
-- Check that if subquery is pulled, we don't error and run query properly.
|
-- Check that if subquery is pulled, we don't error and run query properly.
|
||||||
|
|
||||||
--SELECT count(*) FROM
|
SELECT count(*) FROM
|
||||||
--(
|
(
|
||||||
--SELECT l_orderkey FROM (
|
SELECT l_orderkey FROM (
|
||||||
--(SELECT l_orderkey FROM lineitem_subquery) UNION
|
(SELECT l_orderkey FROM lineitem_subquery) UNION
|
||||||
--(SELECT l_orderkey FROM lineitem_subquery)
|
(SELECT l_orderkey FROM lineitem_subquery)
|
||||||
--) a
|
) a
|
||||||
--WHERE l_orderkey = 1
|
WHERE l_orderkey = 1
|
||||||
--) b;
|
) b;
|
||||||
|
|
||||||
--SELECT count(*) FROM
|
SELECT count(*) FROM
|
||||||
--(
|
(
|
||||||
--SELECT * FROM (
|
SELECT * FROM (
|
||||||
--(SELECT * FROM lineitem_subquery) UNION
|
(SELECT * FROM lineitem_subquery) UNION
|
||||||
--(SELECT * FROM lineitem_subquery)
|
(SELECT * FROM lineitem_subquery)
|
||||||
--) a
|
) a
|
||||||
--WHERE l_orderkey = 1
|
WHERE l_orderkey = 1
|
||||||
--) b;
|
) b;
|
||||||
|
|
||||||
SELECT max(l_orderkey) FROM
|
SELECT max(l_orderkey) FROM
|
||||||
(
|
(
|
||||||
|
|
|
@ -174,28 +174,33 @@ FROM
|
||||||
l_orderkey) AS unit_prices;
|
l_orderkey) AS unit_prices;
|
||||||
ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys
|
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.
|
DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator.
|
||||||
-- Check that we error out if there is union all.
|
-- Check that we error out if there is non relation subqueries
|
||||||
-- TEMPORARLY DISABLE UNION ALL
|
SELECT count(*) FROM
|
||||||
-- SELECT count(*) FROM
|
(
|
||||||
-- (
|
(SELECT l_orderkey FROM lineitem_subquery) UNION ALL
|
||||||
-- (SELECT l_orderkey FROM lineitem_subquery) UNION ALL
|
(SELECT 1::bigint)
|
||||||
-- (SELECT 1::bigint)
|
) b;
|
||||||
--) b;
|
ERROR: cannot push down this subquery
|
||||||
---
|
DETAIL: Subqueries without relations are unsupported
|
||||||
-- TEMPORARLY DISABLE UNIONS WITHOUT JOINS
|
|
||||||
---
|
|
||||||
-- Check that we error out if queries in union do not include partition columns.
|
-- Check that we error out if queries in union do not include partition columns.
|
||||||
--SELECT count(*) FROM
|
SELECT count(*) FROM
|
||||||
--(
|
(
|
||||||
-- (SELECT l_orderkey FROM lineitem_subquery) UNION
|
(SELECT l_orderkey FROM lineitem_subquery) UNION
|
||||||
-- (SELECT l_partkey FROM lineitem_subquery)
|
(SELECT l_partkey FROM lineitem_subquery)
|
||||||
--) b;
|
) b;
|
||||||
|
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.
|
||||||
-- Check that we run union queries if partition column is selected.
|
-- Check that we run union queries if partition column is selected.
|
||||||
--SELECT count(*) FROM
|
SELECT count(*) FROM
|
||||||
--(
|
(
|
||||||
-- (SELECT l_orderkey FROM lineitem_subquery) UNION
|
(SELECT l_orderkey FROM lineitem_subquery) UNION
|
||||||
-- (SELECT l_orderkey FROM lineitem_subquery)
|
(SELECT l_orderkey FROM lineitem_subquery)
|
||||||
--) b;
|
) b;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
2985
|
||||||
|
(1 row)
|
||||||
|
|
||||||
-- Check that we error out if inner query has limit but outer quers has not.
|
-- Check that we error out if inner query has limit but outer quers has not.
|
||||||
SELECT
|
SELECT
|
||||||
avg(o_totalprice/l_quantity)
|
avg(o_totalprice/l_quantity)
|
||||||
|
@ -289,22 +294,32 @@ WHERE
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- Check that if subquery is pulled, we don't error and run query properly.
|
-- Check that if subquery is pulled, we don't error and run query properly.
|
||||||
--SELECT count(*) FROM
|
SELECT count(*) FROM
|
||||||
--(
|
(
|
||||||
--SELECT l_orderkey FROM (
|
SELECT l_orderkey FROM (
|
||||||
--(SELECT l_orderkey FROM lineitem_subquery) UNION
|
(SELECT l_orderkey FROM lineitem_subquery) UNION
|
||||||
--(SELECT l_orderkey FROM lineitem_subquery)
|
(SELECT l_orderkey FROM lineitem_subquery)
|
||||||
--) a
|
) a
|
||||||
--WHERE l_orderkey = 1
|
WHERE l_orderkey = 1
|
||||||
--) b;
|
) b;
|
||||||
--SELECT count(*) FROM
|
count
|
||||||
--(
|
-------
|
||||||
--SELECT * FROM (
|
1
|
||||||
--(SELECT * FROM lineitem_subquery) UNION
|
(1 row)
|
||||||
--(SELECT * FROM lineitem_subquery)
|
|
||||||
--) a
|
SELECT count(*) FROM
|
||||||
--WHERE l_orderkey = 1
|
(
|
||||||
--) b;
|
SELECT * FROM (
|
||||||
|
(SELECT * FROM lineitem_subquery) UNION
|
||||||
|
(SELECT * FROM lineitem_subquery)
|
||||||
|
) a
|
||||||
|
WHERE l_orderkey = 1
|
||||||
|
) b;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
6
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT max(l_orderkey) FROM
|
SELECT max(l_orderkey) FROM
|
||||||
(
|
(
|
||||||
SELECT l_orderkey FROM (
|
SELECT l_orderkey FROM (
|
||||||
|
|
|
@ -174,28 +174,33 @@ FROM
|
||||||
l_orderkey) AS unit_prices;
|
l_orderkey) AS unit_prices;
|
||||||
ERROR: cannot pushdown the subquery since all relations are not joined using distribution keys
|
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.
|
DETAIL: Each relation should be joined with at least one another relation using distribution keys and equality operator.
|
||||||
-- Check that we error out if there is union all.
|
-- Check that we error out if there is non relation subqueries
|
||||||
-- TEMPORARLY DISABLE UNION ALL
|
SELECT count(*) FROM
|
||||||
-- SELECT count(*) FROM
|
(
|
||||||
-- (
|
(SELECT l_orderkey FROM lineitem_subquery) UNION ALL
|
||||||
-- (SELECT l_orderkey FROM lineitem_subquery) UNION ALL
|
(SELECT 1::bigint)
|
||||||
-- (SELECT 1::bigint)
|
) b;
|
||||||
--) b;
|
ERROR: cannot push down this subquery
|
||||||
---
|
DETAIL: Subqueries without relations are unsupported
|
||||||
-- TEMPORARLY DISABLE UNIONS WITHOUT JOINS
|
|
||||||
---
|
|
||||||
-- Check that we error out if queries in union do not include partition columns.
|
-- Check that we error out if queries in union do not include partition columns.
|
||||||
--SELECT count(*) FROM
|
SELECT count(*) FROM
|
||||||
--(
|
(
|
||||||
-- (SELECT l_orderkey FROM lineitem_subquery) UNION
|
(SELECT l_orderkey FROM lineitem_subquery) UNION
|
||||||
-- (SELECT l_partkey FROM lineitem_subquery)
|
(SELECT l_partkey FROM lineitem_subquery)
|
||||||
--) b;
|
) b;
|
||||||
|
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.
|
||||||
-- Check that we run union queries if partition column is selected.
|
-- Check that we run union queries if partition column is selected.
|
||||||
--SELECT count(*) FROM
|
SELECT count(*) FROM
|
||||||
--(
|
(
|
||||||
-- (SELECT l_orderkey FROM lineitem_subquery) UNION
|
(SELECT l_orderkey FROM lineitem_subquery) UNION
|
||||||
-- (SELECT l_orderkey FROM lineitem_subquery)
|
(SELECT l_orderkey FROM lineitem_subquery)
|
||||||
--) b;
|
) b;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
2985
|
||||||
|
(1 row)
|
||||||
|
|
||||||
-- Check that we error out if inner query has limit but outer quers has not.
|
-- Check that we error out if inner query has limit but outer quers has not.
|
||||||
SELECT
|
SELECT
|
||||||
avg(o_totalprice/l_quantity)
|
avg(o_totalprice/l_quantity)
|
||||||
|
@ -289,22 +294,32 @@ WHERE
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- Check that if subquery is pulled, we don't error and run query properly.
|
-- Check that if subquery is pulled, we don't error and run query properly.
|
||||||
--SELECT count(*) FROM
|
SELECT count(*) FROM
|
||||||
--(
|
(
|
||||||
--SELECT l_orderkey FROM (
|
SELECT l_orderkey FROM (
|
||||||
--(SELECT l_orderkey FROM lineitem_subquery) UNION
|
(SELECT l_orderkey FROM lineitem_subquery) UNION
|
||||||
--(SELECT l_orderkey FROM lineitem_subquery)
|
(SELECT l_orderkey FROM lineitem_subquery)
|
||||||
--) a
|
) a
|
||||||
--WHERE l_orderkey = 1
|
WHERE l_orderkey = 1
|
||||||
--) b;
|
) b;
|
||||||
--SELECT count(*) FROM
|
count
|
||||||
--(
|
-------
|
||||||
--SELECT * FROM (
|
1
|
||||||
--(SELECT * FROM lineitem_subquery) UNION
|
(1 row)
|
||||||
--(SELECT * FROM lineitem_subquery)
|
|
||||||
--) a
|
SELECT count(*) FROM
|
||||||
--WHERE l_orderkey = 1
|
(
|
||||||
--) b;
|
SELECT * FROM (
|
||||||
|
(SELECT * FROM lineitem_subquery) UNION
|
||||||
|
(SELECT * FROM lineitem_subquery)
|
||||||
|
) a
|
||||||
|
WHERE l_orderkey = 1
|
||||||
|
) b;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
6
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT max(l_orderkey) FROM
|
SELECT max(l_orderkey) FROM
|
||||||
(
|
(
|
||||||
SELECT l_orderkey FROM (
|
SELECT l_orderkey FROM (
|
||||||
|
|
|
@ -325,7 +325,12 @@ ORDER BY
|
||||||
(
|
(
|
||||||
SELECT
|
SELECT
|
||||||
users_table.user_id,
|
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
|
events_table.time
|
||||||
FROM
|
FROM
|
||||||
users_table,
|
users_table,
|
||||||
|
@ -468,7 +473,7 @@ WHERE user_id IN (SELECT user_id FROM users_table WHERE value_1 >= 10 AND value_
|
||||||
SELECT user_id, value_2 FROM users_table WHERE
|
SELECT user_id, value_2 FROM users_table WHERE
|
||||||
value_1 > 101 AND value_1 < 110
|
value_1 > 101 AND value_1 < 110
|
||||||
AND value_2 >= 5
|
AND value_2 >= 5
|
||||||
AND EXISTS (SELECT user_id FROM events_table WHERE event_type>101 AND event_type < 110 AND value_3 > 100 AND user_id=users_table.user_id);
|
AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 101 AND event_type < 110 AND value_3 > 100 AND user_id = users_table.user_id);
|
||||||
|
|
||||||
------------------------------------
|
------------------------------------
|
||||||
-- Customers who haven’t done X, and satisfy other customer specific criteria
|
-- Customers who haven’t done X, and satisfy other customer specific criteria
|
||||||
|
@ -477,7 +482,7 @@ SELECT user_id, value_2 FROM users_table WHERE
|
||||||
SELECT user_id, value_2 FROM users_table WHERE
|
SELECT user_id, value_2 FROM users_table WHERE
|
||||||
value_1 = 101
|
value_1 = 101
|
||||||
AND value_2 >= 5
|
AND value_2 >= 5
|
||||||
AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type=101 AND value_3 > 100 AND user_id=users_table.user_id);
|
AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type=101 AND value_3 > 100 AND user_id = users_table.user_id);
|
||||||
|
|
||||||
------------------------------------
|
------------------------------------
|
||||||
-- Customers who have done X and Y, and satisfy other customer specific criteria
|
-- Customers who have done X and Y, and satisfy other customer specific criteria
|
||||||
|
@ -486,8 +491,8 @@ SELECT user_id, value_2 FROM users_table WHERE
|
||||||
SELECT user_id, value_2 FROM users_table WHERE
|
SELECT user_id, value_2 FROM users_table WHERE
|
||||||
value_1 > 100
|
value_1 > 100
|
||||||
AND value_2 >= 5
|
AND value_2 >= 5
|
||||||
AND EXISTS (SELECT user_id FROM events_table WHERE event_type!=100 AND value_3 > 100 AND user_id=users_table.user_id)
|
AND EXISTS (SELECT user_id FROM events_table WHERE event_type != 100 AND value_3 > 100 AND user_id = users_table.user_id)
|
||||||
AND EXISTS (SELECT user_id FROM events_table WHERE event_type=101 AND value_3 > 100 AND user_id=users_table.user_id);
|
AND EXISTS (SELECT user_id FROM events_table WHERE event_type = 101 AND value_3 > 100 AND user_id = users_table.user_id);
|
||||||
|
|
||||||
------------------------------------
|
------------------------------------
|
||||||
-- Customers who have done X and haven’t done Y, and satisfy other customer specific criteria
|
-- Customers who have done X and haven’t done Y, and satisfy other customer specific criteria
|
||||||
|
@ -495,8 +500,8 @@ SELECT user_id, value_2 FROM users_table WHERE
|
||||||
------------------------------------
|
------------------------------------
|
||||||
SELECT user_id, value_2 FROM users_table WHERE
|
SELECT user_id, value_2 FROM users_table WHERE
|
||||||
value_2 >= 5
|
value_2 >= 5
|
||||||
AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 100 AND event_type <= 300 AND value_3 > 100 AND user_id=users_table.user_id)
|
AND EXISTS (SELECT user_id FROM events_table WHERE event_type > 100 AND event_type <= 300 AND value_3 > 100 AND user_id = users_table.user_id)
|
||||||
AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type > 300 AND event_type <= 350 AND value_3 > 100 AND user_id=users_table.user_id);
|
AND NOT EXISTS (SELECT user_id FROM events_table WHERE event_type > 300 AND event_type <= 350 AND value_3 > 100 AND user_id = users_table.user_id);
|
||||||
|
|
||||||
------------------------------------
|
------------------------------------
|
||||||
-- Customers who have done X more than 2 times, and satisfy other customer specific criteria
|
-- Customers who have done X more than 2 times, and satisfy other customer specific criteria
|
||||||
|
@ -522,18 +527,31 @@ SELECT user_id,
|
||||||
------------------------------------
|
------------------------------------
|
||||||
SELECT user_id, value_1 from
|
SELECT user_id, value_1 from
|
||||||
(
|
(
|
||||||
SELECT user_id, value_1 From users_table
|
SELECT
|
||||||
WHERE value_2 > 100 and user_id = 15 GROUP BY value_1, user_id HAVING count(*) > 1
|
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
|
) 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
|
-- same query with additional filter to make it not router plannable
|
||||||
SELECT user_id, value_1 from
|
SELECT user_id, value_1 from
|
||||||
(
|
(
|
||||||
SELECT user_id, value_1 From users_table
|
SELECT
|
||||||
WHERE value_2 > 100 and (user_id = 15 OR user_id = 16) GROUP BY value_1, user_id HAVING count(*) > 1
|
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
|
) 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
|
-- 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
|
SELECT user_id
|
||||||
FROM events_table
|
FROM events_table
|
||||||
WHERE
|
WHERE
|
||||||
event_type = 16 AND value_2 > 50
|
event_type = 16 AND value_2 > 50 AND
|
||||||
AND user_id IN
|
user_id IN
|
||||||
(SELECT user_id
|
(SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
|
FROM
|
||||||
|
users_table
|
||||||
WHERE
|
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
|
-- Which events_table did people who has done some specific events_table
|
||||||
|
@ -566,10 +587,15 @@ SELECT user_id FROM
|
||||||
user_id
|
user_id
|
||||||
FROM
|
FROM
|
||||||
events_table
|
events_table
|
||||||
WHERE event_type = 901
|
WHERE
|
||||||
GROUP BY user_id HAVING count(*) > 3
|
event_type = 901
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(*) > 3
|
||||||
) AS a
|
) AS a
|
||||||
ORDER BY user_id;
|
ORDER BY
|
||||||
|
user_id;
|
||||||
|
|
||||||
------------------------------------
|
------------------------------------
|
||||||
-- Find my assets that have the highest probability and fetch their metadata
|
-- 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
|
short_list.user_id = ma.user_id and ma.value_1 < 50 and short_list.event_type < 50
|
||||||
) temp
|
) temp
|
||||||
ON users_table.user_id = temp.user_id
|
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
|
-- get some statistics from the aggregated results to ensure the results are correct
|
||||||
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM assets;
|
SELECT count(*), count(DISTINCT user_id), avg(user_id) FROM assets;
|
||||||
|
@ -599,13 +626,17 @@ DROP TABLE assets;
|
||||||
-- original query that fails
|
-- original query that fails
|
||||||
SELECT count(*) FROM
|
SELECT count(*) FROM
|
||||||
(
|
(
|
||||||
SELECT user_id
|
SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
WHERE (value_1 = '5'
|
FROM
|
||||||
OR value_1 = '13')
|
users_table
|
||||||
AND user_id NOT IN (select user_id from users_table where value_1 = '3')
|
WHERE
|
||||||
GROUP BY user_id
|
(value_1 = '5' OR value_1 = '13') AND
|
||||||
HAVING count(distinct value_1) = 2
|
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;
|
) as foo;
|
||||||
|
|
||||||
-- previous push down query
|
-- previous push down query
|
||||||
|
@ -617,8 +648,10 @@ SELECT subquery_count FROM
|
||||||
users_table
|
users_table
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 = '5' OR value_1 = '13')
|
(value_1 = '5' OR value_1 = '13')
|
||||||
GROUP BY user_id
|
GROUP BY
|
||||||
HAVING count(distinct value_1) = 2) as a
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) = 2) as a
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
user_id
|
user_id
|
||||||
|
@ -626,8 +659,14 @@ SELECT subquery_count FROM
|
||||||
users_table
|
users_table
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 = '3')
|
(value_1 = '3')
|
||||||
GROUP BY user_id) as b on a.user_id = b.user_id WHERE b.user_id IS NULL
|
GROUP BY
|
||||||
GROUP BY a.user_id) AS inner_subquery;
|
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
|
-- new pushdown query without single range table entry at top requirement
|
||||||
SELECT count(*) as subquery_count
|
SELECT count(*) as subquery_count
|
||||||
|
@ -638,8 +677,10 @@ FROM (
|
||||||
users_table
|
users_table
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 = '5' OR value_1 = '13')
|
(value_1 = '5' OR value_1 = '13')
|
||||||
GROUP BY user_id
|
GROUP BY
|
||||||
HAVING count(distinct value_1) = 2
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) = 2
|
||||||
) as a
|
) as a
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -648,10 +689,13 @@ FROM (
|
||||||
users_table
|
users_table
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 = '3')
|
(value_1 = '3')
|
||||||
GROUP BY user_id) AS b
|
GROUP BY
|
||||||
|
user_id) AS b
|
||||||
ON a.user_id = b.user_id
|
ON a.user_id = b.user_id
|
||||||
WHERE b.user_id IS NULL
|
WHERE
|
||||||
GROUP BY a.user_id;
|
b.user_id IS NULL
|
||||||
|
GROUP BY
|
||||||
|
a.user_id;
|
||||||
|
|
||||||
-- multi-subquery-join
|
-- multi-subquery-join
|
||||||
-- The first query has filters on partion column to make it router plannable
|
-- The first query has filters on partion column to make it router plannable
|
||||||
|
@ -716,9 +760,11 @@ FROM (
|
||||||
ORDER BY time
|
ORDER BY time
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
) e5 ON true
|
) e5 ON true
|
||||||
where e1.user_id = 1
|
WHERE
|
||||||
group by e1.user_id
|
e1.user_id = 1
|
||||||
limit 1;
|
GROUP BY
|
||||||
|
e1.user_id
|
||||||
|
LIMIT 1;
|
||||||
|
|
||||||
-- Same query without all limitations
|
-- Same query without all limitations
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -853,8 +899,10 @@ FROM (
|
||||||
users_table
|
users_table
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 > 5)
|
(value_1 > 5)
|
||||||
GROUP BY user_id
|
GROUP BY
|
||||||
HAVING count(distinct value_1) > 88
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) > 88
|
||||||
) as a
|
) as a
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -864,12 +912,15 @@ FROM (
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 > 3)) AS b
|
(value_1 > 3)) AS b
|
||||||
ON a.user_id = b.user_id
|
ON a.user_id = b.user_id
|
||||||
WHERE b.user_id IS NOT NULL
|
WHERE
|
||||||
GROUP BY a.user_id
|
b.user_id IS NOT NULL
|
||||||
ORDER BY avg(b.value_3), 2, 1
|
GROUP BY
|
||||||
|
a.user_id
|
||||||
|
ORDER BY
|
||||||
|
avg(b.value_3), 2, 1
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
|
|
||||||
-- add having
|
-- add having to the same query
|
||||||
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
||||||
FROM (
|
FROM (
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -889,30 +940,46 @@ FROM (
|
||||||
WHERE
|
WHERE
|
||||||
(value_1 > 3)) AS b
|
(value_1 > 3)) AS b
|
||||||
ON a.user_id = b.user_id
|
ON a.user_id = b.user_id
|
||||||
WHERE b.user_id IS NOT NULL
|
WHERE
|
||||||
GROUP BY a.user_id
|
b.user_id IS NOT NULL
|
||||||
HAVING sum(b.value_3) > 50000
|
GROUP BY
|
||||||
ORDER BY avg(b.value_3), 2, 1
|
a.user_id
|
||||||
|
HAVING
|
||||||
|
sum(b.value_3) > 50000
|
||||||
|
ORDER BY
|
||||||
|
avg(b.value_3), 2, 1
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
|
|
||||||
-- avg on the value_3 is not a resjunk
|
-- avg on the value_3 is not a resjunk
|
||||||
SELECT a.user_id, avg(b.value_2) as subquery_avg, avg(b.value_3)
|
SELECT a.user_id, avg(b.value_2) as subquery_avg, avg(b.value_3)
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id
|
(SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
WHERE (value_1 > 5)
|
FROM
|
||||||
GROUP BY user_id
|
users_table
|
||||||
HAVING count(distinct value_1) > 88
|
WHERE
|
||||||
|
(value_1 > 5)
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) > 88
|
||||||
) as a
|
) as a
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
(SELECT user_id, value_2, value_3
|
(
|
||||||
FROM users_table
|
SELECT
|
||||||
WHERE (value_1 > 3)
|
user_id, value_2, value_3
|
||||||
|
FROM
|
||||||
|
users_table
|
||||||
|
WHERE
|
||||||
|
(value_1 > 3)
|
||||||
) AS b
|
) AS b
|
||||||
ON a.user_id = b.user_id
|
ON a.user_id = b.user_id
|
||||||
WHERE b.user_id IS NOT NULL
|
WHERE
|
||||||
GROUP BY a.user_id
|
b.user_id IS NOT NULL
|
||||||
ORDER BY avg(b.value_3) DESC, 2, 1
|
GROUP BY
|
||||||
|
a.user_id
|
||||||
|
ORDER BY
|
||||||
|
avg(b.value_3) DESC, 2, 1
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
|
|
||||||
-- a powerful query structure that analyzes users/events
|
-- 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
|
FROM
|
||||||
users_table u
|
users_table u
|
||||||
LEFT OUTER JOIN LATERAL
|
LEFT OUTER JOIN LATERAL
|
||||||
(SELECT *
|
(SELECT
|
||||||
FROM events_table e1
|
*
|
||||||
WHERE e1.user_id = u.user_id
|
FROM
|
||||||
ORDER BY e1.value_3 DESC
|
events_table e1
|
||||||
|
WHERE
|
||||||
|
e1.user_id = u.user_id
|
||||||
|
ORDER BY
|
||||||
|
e1.value_3 DESC
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
) sub
|
) sub
|
||||||
ON true
|
ON true
|
||||||
LEFT OUTER JOIN events_table e2
|
LEFT OUTER JOIN events_table e2
|
||||||
ON e2.user_id = sub.user_id
|
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
|
WHERE
|
||||||
GROUP BY u.user_id, sub.value_2, sub.value_3
|
e2.value_2 > 10 AND e2.value_2 < 50 AND u.value_2 > 10 AND u.value_2 < 50
|
||||||
ORDER BY 4 DESC, 1 DESC, 2 ASC, 3 ASC
|
GROUP BY
|
||||||
|
u.user_id, sub.value_2, sub.value_3
|
||||||
|
ORDER BY
|
||||||
|
4 DESC, 1 DESC, 2 ASC, 3 ASC
|
||||||
LIMIT 10;
|
LIMIT 10;
|
||||||
|
|
||||||
-- distinct users joined with events
|
-- distinct users joined with events
|
||||||
|
@ -941,12 +1015,16 @@ SELECT
|
||||||
count(*) as users_count
|
count(*) as users_count
|
||||||
FROM events_table
|
FROM events_table
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT DISTINCT user_id
|
(SELECT
|
||||||
FROM users_table
|
DISTINCT user_id
|
||||||
|
FROM
|
||||||
|
users_table
|
||||||
) as distinct_users
|
) as distinct_users
|
||||||
ON distinct_users.user_id = events_table.user_id
|
ON distinct_users.user_id = events_table.user_id
|
||||||
GROUP BY distinct_users.user_id
|
GROUP BY
|
||||||
ORDER BY users_count desc, avg_type DESC
|
distinct_users.user_id
|
||||||
|
ORDER BY
|
||||||
|
users_count desc, avg_type DESC
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
|
|
||||||
-- reduce the data set, aggregate and join
|
-- reduce the data set, aggregate and join
|
||||||
|
@ -957,44 +1035,65 @@ FROM events_table
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT distinct_users.user_id, count(1) as ct
|
(SELECT distinct_users.user_id, count(1) as ct
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id
|
(SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
|
FROM
|
||||||
|
users_table
|
||||||
) as distinct_users
|
) as distinct_users
|
||||||
GROUP BY distinct_users.user_id
|
GROUP BY
|
||||||
|
distinct_users.user_id
|
||||||
) as users_count
|
) as users_count
|
||||||
ON users_count.user_id = events_table.user_id
|
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;
|
LIMIT 5;
|
||||||
|
|
||||||
--- now, test (subquery JOIN subquery)
|
--- now, test (subquery JOIN subquery)
|
||||||
SELECT n1.user_id, count_1, total_count
|
SELECT n1.user_id, count_1, total_count
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id, count(1) as count_1
|
(SELECT
|
||||||
FROM users_table
|
user_id, count(1) as count_1
|
||||||
GROUP BY user_id
|
FROM
|
||||||
|
users_table
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
) n1
|
) n1
|
||||||
INNER JOIN
|
INNER JOIN
|
||||||
(SELECT user_id, count(1) as total_count
|
(
|
||||||
FROM events_table
|
SELECT
|
||||||
GROUP BY user_id, event_type
|
user_id, count(1) as total_count
|
||||||
|
FROM
|
||||||
|
events_table
|
||||||
|
GROUP BY
|
||||||
|
user_id, event_type
|
||||||
) n2
|
) n2
|
||||||
ON (n2.user_id = n1.user_id)
|
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;
|
LIMIT 10;
|
||||||
|
|
||||||
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id
|
(SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
WHERE (value_1 > 5)
|
FROM
|
||||||
GROUP BY user_id
|
users_table
|
||||||
HAVING count(distinct value_1) > 88
|
WHERE
|
||||||
|
(value_1 > 5)
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) > 88
|
||||||
) as a
|
) as a
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
(SELECT DISTINCT ON (user_id) user_id, value_2, value_3
|
(SELECT
|
||||||
FROM users_table
|
DISTINCT ON (user_id) user_id, value_2, value_3
|
||||||
WHERE (value_1 > 3)
|
FROM
|
||||||
ORDER BY 1,2,3
|
users_table
|
||||||
|
WHERE
|
||||||
|
(value_1 > 3)
|
||||||
|
ORDER BY
|
||||||
|
1,2,3
|
||||||
) AS b
|
) AS b
|
||||||
ON a.user_id = b.user_id
|
ON a.user_id = b.user_id
|
||||||
WHERE b.user_id IS NOT NULL
|
WHERE b.user_id IS NOT NULL
|
||||||
|
@ -1006,39 +1105,60 @@ LIMIT 5;
|
||||||
-- when used in target list
|
-- when used in target list
|
||||||
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id
|
(SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
WHERE (value_1 > 5)
|
FROM
|
||||||
GROUP BY user_id
|
users_table
|
||||||
HAVING count(distinct value_1) > 88
|
WHERE
|
||||||
|
(value_1 > 5)
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) > 88
|
||||||
) as a
|
) as a
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
(SELECT DISTINCT ON (value_2) value_2 , user_id, value_3
|
(SELECT
|
||||||
FROM users_table
|
DISTINCT ON (value_2) value_2 , user_id, value_3
|
||||||
WHERE (value_1 > 3)
|
FROM
|
||||||
ORDER BY 1,2,3
|
users_table
|
||||||
|
WHERE
|
||||||
|
(value_1 > 3)
|
||||||
|
ORDER BY
|
||||||
|
1,2,3
|
||||||
) AS b
|
) AS b
|
||||||
USING (user_id)
|
USING (user_id)
|
||||||
GROUP BY user_id;
|
GROUP BY user_id;
|
||||||
|
|
||||||
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
SELECT a.user_id, avg(b.value_2) as subquery_avg
|
||||||
FROM
|
FROM
|
||||||
(SELECT user_id
|
(SELECT
|
||||||
FROM users_table
|
user_id
|
||||||
WHERE (value_1 > 5)
|
FROM
|
||||||
GROUP BY user_id
|
users_table
|
||||||
HAVING count(distinct value_1) > 88
|
WHERE
|
||||||
|
(value_1 > 5)
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
|
HAVING
|
||||||
|
count(distinct value_1) > 88
|
||||||
) as a
|
) as a
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
(SELECT DISTINCT ON (value_2, user_id) value_2 , user_id, value_3
|
(SELECT
|
||||||
FROM users_table
|
DISTINCT ON (value_2, user_id) value_2 , user_id, value_3
|
||||||
WHERE (value_1 > 3)
|
FROM
|
||||||
ORDER BY 1,2,3
|
users_table
|
||||||
|
WHERE
|
||||||
|
(value_1 > 3)
|
||||||
|
ORDER BY
|
||||||
|
1,2,3
|
||||||
) AS b
|
) AS b
|
||||||
ON a.user_id = b.user_id
|
ON a.user_id = b.user_id
|
||||||
WHERE b.user_id IS NOT NULL
|
WHERE
|
||||||
GROUP BY a.user_id
|
b.user_id IS NOT NULL
|
||||||
ORDER BY avg(b.value_3), 2, 1
|
GROUP BY
|
||||||
|
a.user_id
|
||||||
|
ORDER BY
|
||||||
|
avg(b.value_3), 2, 1
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
|
|
||||||
SELECT user_id, event_type
|
SELECT user_id, event_type
|
||||||
|
@ -1046,40 +1166,55 @@ FROM
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
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
|
JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
ma.user_id AS user_id, ma.value_2 AS value_2,
|
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
|
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
|
||||||
FROM users_table AS ma
|
FROM
|
||||||
WHERE (ma.value_2 > 100)
|
users_table AS ma
|
||||||
ORDER BY prob DESC, user_id DESC
|
WHERE
|
||||||
|
(ma.value_2 > 100)
|
||||||
|
ORDER BY
|
||||||
|
prob DESC, user_id DESC
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
) AS ma
|
) AS ma
|
||||||
ON (a.a_user_id = ma.user_id)
|
ON (a.a_user_id = ma.user_id)
|
||||||
) AS inner_sub
|
) AS inner_sub
|
||||||
ORDER BY prob DESC, user_id DESC
|
ORDER BY
|
||||||
|
prob DESC, user_id DESC
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
) AS outer_sub
|
) 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;
|
LIMIT 10;
|
||||||
|
|
||||||
-- very similar query but produces different result due to
|
-- very similar query but produces different result due to
|
||||||
-- ordering difference in the previous one's inner query
|
-- ordering difference in the previous one's inner query
|
||||||
SELECT user_id, event_type
|
SELECT user_id, event_type
|
||||||
FROM
|
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
|
JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
ma.user_id AS user_id, ma.value_2 AS value_2,
|
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
|
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
|
||||||
FROM users_table AS ma
|
FROM
|
||||||
WHERE (ma.value_2 > 100)
|
users_table AS ma
|
||||||
ORDER BY prob DESC, user_id DESC
|
WHERE
|
||||||
|
(ma.value_2 > 100)
|
||||||
|
ORDER BY
|
||||||
|
prob DESC, user_id DESC
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
) AS ma
|
) AS ma
|
||||||
ON (a.a_user_id = ma.user_id)
|
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;
|
LIMIT 10;
|
||||||
|
|
||||||
-- now they produce the same result when ordering fixed in 'outer_sub'
|
-- now they produce the same result when ordering fixed in 'outer_sub'
|
||||||
|
@ -1088,22 +1223,31 @@ FROM
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
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
|
JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
ma.user_id AS user_id, ma.value_2 AS value_2,
|
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
|
(GREATEST(coalesce((ma.value_3 * ma.value_2) / 20, 0.0) + GREATEST(1.0))) / 2 AS prob
|
||||||
FROM users_table AS ma
|
FROM
|
||||||
WHERE (ma.value_2 > 100)
|
users_table AS ma
|
||||||
ORDER BY prob DESC, user_id DESC
|
WHERE
|
||||||
|
(ma.value_2 > 100)
|
||||||
|
ORDER BY
|
||||||
|
prob DESC, user_id DESC
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
) AS ma
|
) AS ma
|
||||||
ON (a.a_user_id = ma.user_id)
|
ON (a.a_user_id = ma.user_id)
|
||||||
) AS inner_sub
|
) 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
|
LIMIT 10
|
||||||
) AS outer_sub
|
) 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;
|
LIMIT 10;
|
||||||
|
|
||||||
-- this is one complex join query derived from a user's production query
|
-- 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 *
|
SELECT *
|
||||||
FROM
|
FROM
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
FROM (
|
||||||
(
|
(SELECT user_id AS user_id_e,
|
||||||
(SELECT
|
event_type AS event_type_e
|
||||||
user_id AS user_id_e,
|
FROM events_table ) AS ma_e
|
||||||
event_type as event_type_e
|
|
||||||
FROM
|
|
||||||
events_table
|
|
||||||
) AS ma_e
|
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT
|
(SELECT value_2,
|
||||||
value_2,
|
|
||||||
value_3,
|
value_3,
|
||||||
user_id
|
user_id
|
||||||
FROM
|
FROM
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
FROM (
|
||||||
(
|
|
||||||
(SELECT user_id_p AS user_id
|
(SELECT user_id_p AS user_id
|
||||||
FROM
|
FROM
|
||||||
(SELECT *
|
(SELECT *
|
||||||
|
FROM (
|
||||||
|
(SELECT
|
||||||
|
user_id AS user_id_p
|
||||||
FROM
|
FROM
|
||||||
(
|
events_table
|
||||||
(SELECT user_id AS user_id_p
|
WHERE
|
||||||
FROM events_table
|
(event_type IN (1,2,3,4,5)) ) AS ma_p
|
||||||
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
|
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
value_2,
|
user_id AS user_id_a
|
||||||
value_3,
|
FROM
|
||||||
user_id AS user_id_ck
|
users_table
|
||||||
FROM events_table
|
WHERE
|
||||||
WHERE event_type = ANY(ARRAY [10, 11, 12])
|
(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
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
||||||
user_id_ck DESC,
|
LIMIT 10 )
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
AS ma_ck ON (ma_ck.user_id_ck = inner_filter_q.user_id) )
|
||||||
LIMIT 10
|
AS inner_sub_q
|
||||||
) AS ma_ck
|
|
||||||
ON (ma_ck.user_id_ck = inner_filter_q.user_id)
|
|
||||||
) AS inner_sub_q
|
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
||||||
user_id_ck DESC,
|
LIMIT 10 )
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
AS outer_sub_q
|
||||||
LIMIT 10
|
|
||||||
) AS outer_sub_q
|
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
||||||
user_id DESC,
|
LIMIT 10)
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
AS inner_search_q
|
||||||
LIMIT 10) AS inner_search_q
|
ON (ma_e.user_id_e = inner_search_q.user_id) )
|
||||||
ON (ma_e.user_id_e = inner_search_q.user_id)
|
AS outer_inner_sub_q
|
||||||
) AS outer_inner_sub_q
|
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
|
||||||
user_id DESC,
|
LIMIT 10)
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
|
AS outer_outer_sub_q
|
||||||
event_type_e DESC
|
|
||||||
LIMIT 10) AS outer_outer_sub_q
|
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
|
||||||
user_id DESC,
|
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
|
|
||||||
event_type_e DESC
|
|
||||||
LIMIT 10;
|
LIMIT 10;
|
||||||
|
|
||||||
-- top level select * is removed now there is
|
-- top level select * is removed now there is
|
||||||
|
@ -1211,33 +1338,39 @@ SELECT *
|
||||||
FROM
|
FROM
|
||||||
(
|
(
|
||||||
(SELECT
|
(SELECT
|
||||||
user_id AS user_id_e,
|
user_id AS user_id_e, event_type as event_type_e
|
||||||
event_type as event_type_e
|
|
||||||
FROM
|
FROM
|
||||||
events_table
|
events_table
|
||||||
) AS ma_e
|
) AS ma_e
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
value_2,
|
value_2, value_3, user_id
|
||||||
value_3,
|
|
||||||
user_id
|
|
||||||
FROM
|
FROM
|
||||||
(SELECT *
|
(SELECT
|
||||||
|
*
|
||||||
FROM
|
FROM
|
||||||
(
|
(
|
||||||
(SELECT user_id_p AS user_id
|
(SELECT
|
||||||
|
user_id_p AS user_id
|
||||||
FROM
|
FROM
|
||||||
(SELECT *
|
(SELECT
|
||||||
|
*
|
||||||
FROM
|
FROM
|
||||||
(
|
(
|
||||||
(SELECT user_id AS user_id_p
|
(SELECT
|
||||||
FROM events_table
|
user_id AS user_id_p
|
||||||
WHERE (event_type IN (1, 2, 3, 4, 5))
|
FROM
|
||||||
|
events_table
|
||||||
|
WHERE
|
||||||
|
(event_type IN (1, 2, 3, 4, 5))
|
||||||
) AS ma_p
|
) AS ma_p
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT user_id AS user_id_a
|
(SELECT
|
||||||
FROM users_table
|
user_id AS user_id_a
|
||||||
WHERE (value_2 % 5 = 1)
|
FROM
|
||||||
|
users_table
|
||||||
|
WHERE
|
||||||
|
(value_2 % 5 = 1)
|
||||||
) AS a
|
) AS a
|
||||||
ON (a.user_id_a = ma_p.user_id_p)
|
ON (a.user_id_a = ma_p.user_id_p)
|
||||||
)
|
)
|
||||||
|
@ -1245,37 +1378,28 @@ FROM
|
||||||
) AS inner_filter_q
|
) AS inner_filter_q
|
||||||
JOIN
|
JOIN
|
||||||
(SELECT
|
(SELECT
|
||||||
value_2,
|
value_2, value_3, user_id AS user_id_ck
|
||||||
value_3,
|
FROM
|
||||||
user_id AS user_id_ck
|
events_table
|
||||||
FROM events_table
|
WHERE
|
||||||
WHERE event_type = ANY(ARRAY [10, 11, 12])
|
event_type = ANY(ARRAY [10, 11, 12])
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
||||||
user_id_ck DESC,
|
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
) AS ma_ck
|
) AS ma_ck
|
||||||
ON (ma_ck.user_id_ck = inner_filter_q.user_id)
|
ON (ma_ck.user_id_ck = inner_filter_q.user_id)
|
||||||
) AS inner_sub_q
|
) AS inner_sub_q
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id_ck DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
||||||
user_id_ck DESC,
|
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
) AS outer_sub_q
|
) AS outer_sub_q
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
||||||
user_id DESC,
|
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC
|
|
||||||
LIMIT 10) AS inner_search_q
|
LIMIT 10) AS inner_search_q
|
||||||
ON (ma_e.user_id_e = inner_search_q.user_id)
|
ON (ma_e.user_id_e = inner_search_q.user_id)
|
||||||
) AS outer_inner_sub_q
|
) AS outer_inner_sub_q
|
||||||
ORDER BY
|
ORDER BY
|
||||||
value_3 ASC,
|
value_3 ASC, user_id DESC, array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC, event_type_e DESC
|
||||||
user_id DESC,
|
|
||||||
array_index(ARRAY [1, 2, 3], (value_2 % 3)) ASC,
|
|
||||||
event_type_e DESC
|
|
||||||
LIMIT 10;
|
LIMIT 10;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1354,11 +1478,13 @@ SELECT user_id, array_length(events_table, 1)
|
||||||
FROM (
|
FROM (
|
||||||
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
||||||
FROM (
|
FROM (
|
||||||
SELECT u.user_id, e.event_type::text AS event, e.time
|
SELECT
|
||||||
FROM users_table AS u,
|
u.user_id, e.event_type::text AS event, e.time
|
||||||
|
FROM
|
||||||
|
users_table AS u,
|
||||||
events_table AS e
|
events_table AS e
|
||||||
WHERE u.user_id = e.user_id
|
WHERE
|
||||||
AND e.event_type IN (100, 101, 102)
|
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
|
||||||
) t
|
) t
|
||||||
GROUP BY user_id
|
GROUP BY user_id
|
||||||
) q
|
) q
|
||||||
|
@ -1370,11 +1496,13 @@ SELECT user_id, array_length(events_table, 1)
|
||||||
FROM (
|
FROM (
|
||||||
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
||||||
FROM (
|
FROM (
|
||||||
SELECT u.user_id, e.event_type::text AS event, e.time
|
SELECT
|
||||||
FROM users_table AS u,
|
u.user_id, e.event_type::text AS event, e.time
|
||||||
|
FROM
|
||||||
|
users_table AS u,
|
||||||
events_table AS e
|
events_table AS e
|
||||||
WHERE u.user_id = e.user_id
|
WHERE
|
||||||
AND e.event_type IN (100, 101, 102)
|
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
|
||||||
) t
|
) t
|
||||||
GROUP BY user_id
|
GROUP BY user_id
|
||||||
) q
|
) q
|
||||||
|
@ -1392,11 +1520,13 @@ SELECT user_id, array_length(events_table, 1)
|
||||||
FROM (
|
FROM (
|
||||||
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
||||||
FROM (
|
FROM (
|
||||||
SELECT u.user_id, e.event_type::text AS event, e.time
|
SELECT
|
||||||
FROM users_table AS u,
|
u.user_id, e.event_type::text AS event, e.time
|
||||||
|
FROM
|
||||||
|
users_table AS u,
|
||||||
events_table AS e
|
events_table AS e
|
||||||
WHERE u.user_id = e.user_id
|
WHERE
|
||||||
AND e.event_type IN (100, 101, 102)
|
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
|
||||||
) t
|
) t
|
||||||
GROUP BY user_id
|
GROUP BY user_id
|
||||||
) q
|
) q
|
||||||
|
@ -1408,11 +1538,13 @@ SELECT user_id, array_length(events_table, 1)
|
||||||
FROM (
|
FROM (
|
||||||
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
SELECT user_id, array_agg(event ORDER BY time) AS events_table
|
||||||
FROM (
|
FROM (
|
||||||
SELECT u.user_id, e.event_type::text AS event, e.time
|
SELECT
|
||||||
FROM users_table AS u,
|
u.user_id, e.event_type::text AS event, e.time
|
||||||
|
FROM
|
||||||
|
users_table AS u,
|
||||||
events_table AS e
|
events_table AS e
|
||||||
WHERE u.user_id = e.user_id
|
WHERE
|
||||||
AND e.event_type IN (100, 101, 102)
|
u.user_id = e.user_id AND e.event_type IN (100, 101, 102)
|
||||||
) t
|
) t
|
||||||
GROUP BY user_id
|
GROUP BY user_id
|
||||||
) q
|
) q
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -123,34 +123,40 @@ FROM (
|
||||||
( SELECT user_id,
|
( SELECT user_id,
|
||||||
sum(counter)
|
sum(counter)
|
||||||
FROM
|
FROM
|
||||||
( SELECT user_id,
|
(SELECT
|
||||||
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)
|
|
||||||
FROM
|
|
||||||
( SELECT
|
|
||||||
user_id, sum(value_2) AS counter
|
user_id, sum(value_2) AS counter
|
||||||
FROM users_table
|
FROM
|
||||||
GROUP BY user_id
|
users_table
|
||||||
|
GROUP BY
|
||||||
|
user_id
|
||||||
UNION
|
UNION
|
||||||
|
SELECT
|
||||||
SELECT user_id, sum(value_2) AS counter
|
user_id, sum(value_2) AS counter
|
||||||
|
FROM
|
||||||
FROM events_table
|
events_table
|
||||||
GROUP BY user_id) user_id_2
|
GROUP BY
|
||||||
GROUP BY user_id)) AS ftop
|
user_id) user_id_1
|
||||||
|
GROUP BY
|
||||||
|
user_id)
|
||||||
|
UNION
|
||||||
|
(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_2
|
||||||
|
GROUP BY
|
||||||
|
user_id)) AS ftop
|
||||||
ORDER BY 2 DESC, 1 DESC
|
ORDER BY 2 DESC, 1 DESC
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
|
|
||||||
|
@ -159,40 +165,45 @@ SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
|
||||||
FROM
|
FROM
|
||||||
( SELECT *, random()
|
( SELECT *, random()
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t"."user_id",
|
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
|
||||||
"t"."time",
|
|
||||||
unnest("t"."collected_events") AS "event_types"
|
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t1"."user_id",
|
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
|
||||||
min("t1"."time") AS "time",
|
|
||||||
array_agg(("t1"."event")
|
|
||||||
ORDER BY TIME ASC, event DESC) AS collected_events
|
|
||||||
FROM (
|
FROM (
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
FROM
|
||||||
(SELECT "events"."user_id",
|
(SELECT
|
||||||
"events"."time",
|
"events"."user_id", "events"."time", 0 AS event
|
||||||
0 AS event
|
FROM
|
||||||
FROM events_table as "events"
|
events_table as "events"
|
||||||
WHERE event_type IN (10, 11, 12, 13, 14, 15) ) events_subquery_1)
|
WHERE
|
||||||
|
event_type IN (10, 11, 12, 13, 14, 15)) events_subquery_1)
|
||||||
UNION
|
UNION
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
FROM
|
||||||
(SELECT "events"."user_id", "events"."time", 1 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 1 AS event
|
||||||
WHERE event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
|
FROM
|
||||||
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (15, 16, 17, 18, 19) ) events_subquery_2)
|
||||||
UNION
|
UNION
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
FROM
|
||||||
(SELECT "events"."user_id", "events"."time", 2 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 2 AS event
|
||||||
WHERE event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
|
FROM
|
||||||
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (20, 21, 22, 23, 24, 25) ) events_subquery_3)
|
||||||
UNION
|
UNION
|
||||||
(SELECT *
|
(SELECT *
|
||||||
FROM
|
FROM
|
||||||
(SELECT "events"."user_id", "events"."time", 3 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 3 AS event
|
||||||
WHERE event_type IN (26, 27, 28, 29, 30, 13)) events_subquery_4)) t1
|
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"
|
GROUP BY "t1"."user_id") AS t) "q"
|
||||||
) as final_query
|
) as final_query
|
||||||
GROUP BY types
|
GROUP BY types
|
||||||
|
@ -202,36 +213,41 @@ ORDER BY types;
|
||||||
-- but wrapper unions are removed from the inner part of the query
|
-- but wrapper unions are removed from the inner part of the query
|
||||||
SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
|
SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
|
||||||
FROM
|
FROM
|
||||||
( SELECT *, random()
|
(SELECT *, random()
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t"."user_id",
|
(SELECT
|
||||||
"t"."time",
|
"t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
|
||||||
unnest("t"."collected_events") AS "event_types"
|
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t1"."user_id",
|
(SELECT
|
||||||
min("t1"."time") AS "time",
|
"t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
|
||||||
array_agg(("t1"."event")
|
FROM(
|
||||||
ORDER BY TIME ASC, event DESC) AS collected_events
|
(SELECT
|
||||||
FROM (
|
"events"."user_id", "events"."time", 0 AS event
|
||||||
(SELECT "events"."user_id",
|
FROM
|
||||||
"events"."time",
|
events_table as "events"
|
||||||
0 AS event
|
WHERE
|
||||||
FROM events_table as "events"
|
event_type IN (10, 11, 12, 13, 14, 15))
|
||||||
WHERE event_type IN (10, 11, 12, 13, 14, 15))
|
|
||||||
UNION
|
UNION
|
||||||
(SELECT "events"."user_id", "events"."time", 1 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 1 AS event
|
||||||
WHERE event_type IN (15, 16, 17, 18, 19) )
|
FROM
|
||||||
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (15, 16, 17, 18, 19) )
|
||||||
UNION
|
UNION
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 2 AS event
|
"events"."user_id", "events"."time", 2 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (20, 21, 22, 23, 24, 25) )
|
||||||
UNION
|
UNION
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 3 AS event
|
"events"."user_id", "events"."time", 3 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
|
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 "t1"."user_id") AS t) "q"
|
||||||
) as final_query
|
) as final_query
|
||||||
GROUP BY types
|
GROUP BY types
|
||||||
|
@ -240,35 +256,37 @@ ORDER BY types;
|
||||||
-- again excatly the same query with top level wrapper removed
|
-- again excatly the same query with top level wrapper removed
|
||||||
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
|
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t"."user_id",
|
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
|
||||||
"t"."time",
|
|
||||||
unnest("t"."collected_events") AS "event_types"
|
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t1"."user_id",
|
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
|
||||||
min("t1"."time") AS "time",
|
|
||||||
array_agg(("t1"."event")
|
|
||||||
ORDER BY TIME ASC, event DESC) AS collected_events
|
|
||||||
FROM (
|
FROM (
|
||||||
(SELECT "events"."user_id",
|
(SELECT
|
||||||
"events"."time",
|
"events"."user_id", "events"."time", 0 AS event
|
||||||
0 AS event
|
FROM
|
||||||
FROM events_table as "events"
|
events_table as "events"
|
||||||
WHERE event_type IN (10, 11, 12, 13, 14, 15)
|
WHERE
|
||||||
)
|
event_type IN (10, 11, 12, 13, 14, 15))
|
||||||
UNION
|
UNION
|
||||||
(SELECT "events"."user_id", "events"."time", 1 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 1 AS event
|
||||||
WHERE event_type IN (15, 16, 17, 18, 19) )
|
FROM
|
||||||
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (15, 16, 17, 18, 19) )
|
||||||
UNION
|
UNION
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 2 AS event
|
"events"."user_id", "events"."time", 2 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (20, 21, 22, 23, 24, 25) )
|
||||||
UNION
|
UNION
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 3 AS event
|
"events"."user_id", "events"."time", 3 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
|
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 "t1"."user_id") AS t) "q"
|
||||||
GROUP BY types
|
GROUP BY types
|
||||||
ORDER BY types;
|
ORDER BY types;
|
||||||
|
@ -280,60 +298,71 @@ FROM
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t1"."user_id"
|
( SELECT "t1"."user_id"
|
||||||
FROM (
|
FROM (
|
||||||
(SELECT "events"."user_id",
|
(SELECT
|
||||||
"events"."time",
|
"events"."user_id", "events"."time", 0 AS event
|
||||||
0 AS event
|
FROM
|
||||||
FROM events_table as "events"
|
events_table as "events"
|
||||||
WHERE event_type IN (10, 11, 12, 13, 14, 15)
|
WHERE
|
||||||
)
|
event_type IN (10, 11, 12, 13, 14, 15))
|
||||||
UNION
|
UNION
|
||||||
(SELECT "events"."user_id", "events"."time", 1 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 1 AS event
|
||||||
WHERE event_type IN (15, 16, 17, 18, 19) )
|
FROM
|
||||||
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (15, 16, 17, 18, 19) )
|
||||||
UNION
|
UNION
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 2 AS event
|
"events"."user_id", "events"."time", 2 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (20, 21, 22, 23, 24, 25) )
|
||||||
UNION
|
UNION
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 3 AS event
|
"events"."user_id", "events"."time", 3 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
|
events_table as "events"
|
||||||
) AS t) "q" ORDER BY 1 LIMIT 5;
|
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
|
-- a very similar query UNION ALL
|
||||||
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
|
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t"."user_id",
|
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
|
||||||
"t"."time",
|
|
||||||
unnest("t"."collected_events") AS "event_types"
|
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t1"."user_id",
|
( SELECT "t1"."user_id", min("t1"."time") AS "time", array_agg(("t1"."event") ORDER BY TIME ASC, event DESC) AS collected_events
|
||||||
min("t1"."time") AS "time",
|
|
||||||
array_agg(("t1"."event")
|
|
||||||
ORDER BY TIME ASC, event DESC) AS collected_events
|
|
||||||
FROM (
|
FROM (
|
||||||
(SELECT "events"."user_id",
|
(SELECT
|
||||||
"events"."time",
|
"events"."user_id", "events"."time", 0 AS event
|
||||||
0 AS event
|
FROM
|
||||||
FROM events_table as "events"
|
events_table as "events"
|
||||||
WHERE event_type IN (10, 11, 12, 13, 14, 15)
|
WHERE
|
||||||
)
|
event_type IN (10, 11, 12, 13, 14, 15))
|
||||||
UNION ALL
|
UNION ALL
|
||||||
(SELECT "events"."user_id", "events"."time", 1 AS event
|
(SELECT
|
||||||
FROM events_table as "events"
|
"events"."user_id", "events"."time", 1 AS event
|
||||||
WHERE event_type IN (15, 16, 17, 18, 19) )
|
FROM
|
||||||
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (15, 16, 17, 18, 19) )
|
||||||
UNION ALL
|
UNION ALL
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 2 AS event
|
"events"."user_id", "events"."time", 2 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (20, 21, 22, 23, 24, 25) )
|
events_table as "events"
|
||||||
|
WHERE
|
||||||
|
event_type IN (20, 21, 22, 23, 24, 25) )
|
||||||
UNION ALL
|
UNION ALL
|
||||||
|
(SELECT
|
||||||
(SELECT "events"."user_id", "events"."time", 3 AS event
|
"events"."user_id", "events"."time", 3 AS event
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
WHERE event_type IN (26, 27, 28, 29, 30, 13))) t1
|
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 "t1"."user_id") AS t) "q"
|
||||||
GROUP BY types
|
GROUP BY types
|
||||||
ORDER BY types;
|
ORDER BY types;
|
||||||
|
@ -535,34 +564,41 @@ FROM (
|
||||||
( SELECT user_id,
|
( SELECT user_id,
|
||||||
sum(counter)
|
sum(counter)
|
||||||
FROM
|
FROM
|
||||||
( SELECT user_id,
|
(SELECT
|
||||||
sum(value_2) AS counter
|
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)
|
|
||||||
FROM
|
FROM
|
||||||
( SELECT sum(value_2) AS counter,
|
users_table
|
||||||
|
GROUP BY
|
||||||
user_id
|
user_id
|
||||||
FROM users_table
|
|
||||||
GROUP BY user_id
|
|
||||||
|
|
||||||
UNION
|
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
|
-- some UNION all queries that are going to be pulled up
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -644,31 +680,46 @@ FROM
|
||||||
ORDER BY 1 DESC, 2 DESC
|
ORDER BY 1 DESC, 2 DESC
|
||||||
LIMIT 5;
|
LIMIT 5;
|
||||||
|
|
||||||
SELECT ("q"."event_types") as types, count(*) AS sumOfEventType
|
SELECT ("final_query"."event_types") as types, count(*) AS sumOfEventType
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t"."user_id",
|
( SELECT *, random()
|
||||||
"t"."time",
|
|
||||||
unnest("t"."collected_events") AS "event_types"
|
|
||||||
FROM
|
FROM
|
||||||
( SELECT "t1"."user_id",
|
( SELECT "t"."user_id", "t"."time", unnest("t"."collected_events") AS "event_types"
|
||||||
min("t1"."time") AS "time",
|
FROM
|
||||||
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 (
|
FROM (
|
||||||
(SELECT "events"."user_id", "events"."time", 0 AS event
|
(SELECT *
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
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)) events_subquery_1)
|
||||||
UNION
|
UNION
|
||||||
(SELECT "events"."user_id", "events"."time", 1 AS event
|
(SELECT *
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
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) ) events_subquery_2)
|
||||||
UNION
|
UNION
|
||||||
(SELECT "events"."user_id", "events"."time", 2 AS event
|
(SELECT *
|
||||||
FROM events_table as "events"
|
FROM
|
||||||
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) ) events_subquery_3)
|
||||||
UNION
|
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"
|
GROUP BY "t1"."user_id") AS t) "q"
|
||||||
|
) as final_query
|
||||||
GROUP BY types
|
GROUP BY types
|
||||||
ORDER BY types;
|
ORDER BY types;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue