您好,我正在尝试进行队列研究。我在运行查询时遇到有关子查询错误的麻烦。我实际上只能计算重复率,但是当我添加新客户数量和转发器数量时,就会出现错误。我想知道该百分比的详细信息(转发器与新客户数量的比率)在我的最终结果中。
非常感谢您的帮助! :)
24-25-26行
SELECT time_table.*,
(
WITH new_customers AS
(
SELECT DISTINCT
order_report._customer_id
FROM order_report
INNER JOIN
(
SELECT DISTINCT _customer_id
FROM order_report
WHERE order_report._created_at::timestamp BETWEEN time_table.first_order_start AND time_table.first_order_stop
AND _order_status = 'paid' AND _order_product_status != 'UNAVAILABLE'
) AS period_orders ON period_orders._customer_id = order_report._customer_id
WHERE _order_status = 'paid' AND _order_product_status != 'UNAVAILABLE'
GROUP BY order_report._customer_id
HAVING MIN(order_report._created_at::timestamp) BETWEEN time_table.first_order_start AND time_table.first_order_stop
)
SELECT
COUNT(*) as repeaters,
(SELECT COUNT(*) FROM new_customers) as new_customers,
COUNT(*)::float/(SELECT COUNT(*) FROM new_customers) as repeat_percent
FROM
(
SELECT COUNT(*), order_report._customer_id
FROM order_report
INNER JOIN new_customers
ON new_customers._customer_id = order_report._customer_id
WHERE order_report._created_at::timestamp <= time_table.stop
AND _order_status = 'paid' AND _order_product_status != 'UNAVAILABLE'
GROUP BY order_report._customer_id
HAVING COUNT(*) > 1
) AS REPEATS
)
FROM
(
WITH time_serie AS
(
SELECT
generate_series AS start,
(generate_series + interval '3 month' - interval '1 second') AS stop
FROM generate_series('2017-01-01 00:00'::timestamp, '2017-06-30', '1 month')
),
first_order_serie AS
(
SELECT
start AS first_order_start,
stop AS first_order_stop
FROM time_serie
)
SELECT * FROM time_serie, first_order_serie) AS time_table
答案 0 :(得分:0)
我认为您应该对查询进行划分,并一一检查。然后您检测到哪个查询是错误的。如果您奉献它,则可以再次共享它。我认为您的问题也许是这个查询:
-------------------
FROM
(
WITH time_serie AS
(
SELECT
generate_series AS start,
(generate_series + interval '3 month' - interval '1 second') AS stop
FROM generate_series('2017-01-01 00:00'::timestamp, '2017-06-30', '1 month')
),
first_order_serie AS
(
SELECT
start AS first_order_start,
stop AS first_order_stop
FROM time_serie
)
答案 1 :(得分:0)
您的查询以select
开始,因此之后的所有内容都是子查询。
首先使用所有CTE编写查询:
with new_customers as (
. . .
),
time_serie as (
),
first_order_serie as (
)
select . . .
from . . .