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