【发布时间】:2021-10-20 04:59:00
【问题描述】:
WITH
date_range AS (
SELECT '2020-03-01'::date AS start_date, '2020-04-01'::date AS end_date
),
start_accounts AS
(
SELECT account_id, SUM(mrr) AS total_mrr
FROM subscription s INNER JOIN date_range d ON
s.start_date<= d.start_date
AND (s.end_date>d.start_date or s.end_date is null)
GROUP BY account_id
),
end_accounts AS
(
SELECT account_id, SUM(mrr) AS total_mrr
FROM subscription s INNER JOIN date_range d ON
s.start_date<= d.end_date
AND (s.end_date>d.end_date or s.end_date is null)
GROUP BY account_id
),
retained_accounts AS
(
SELECT s.account_id, SUM(e.total_mrr) AS total_mrr
FROM start_accounts s
INNER JOIN end_accounts e ON s.account_id=e.account_id
GROUP BY s.account_id
),
start_mrr AS (
SELECT SUM (start_accounts.total_mrr) AS start_mrr
FROM start_accounts
),
retain_mrr AS (
SELECT SUM(retained_accounts.total_mrr) AS retain_mrr
FROM retained_accounts
)
SELECT
retain_mrr /start_mrr AS net_mrr_retention_rate,
1.0 - retain_mrr /start_mrr AS net_mrr_churn_rate,
start_mrr,
retain_mrr
FROM start_mrr, retain_mrr
【问题讨论】:
-
我不明白这个问题。 Postgres 和 SQL Server 都支持 CTE。
-
好像只需要修改第一个CTE SELECT cast('2020-03-01' as date) AS start_date, cast('2020-04-01' as date) AS end_date。所有其他都可以“按原样”使用
-
我在这个查询中看到的唯一一个 SQL Server 不支持的就是这个语法
'2020-03-01'::date,我假设 sis PostgreSql 用这种方式说这是一个日期数据类型。如果我的假设是正确的,那么 SQL Server 的等价物是CAST('2020-03-01' AS date) -
我不清楚你到底在问什么。您需要修复 Postgres 查询中的问题吗?您是否需要编写一个在 Postgres 和 SQL Server 中无需更改即可工作的查询?是否需要将 Postgres 查询迁移到 SQL Server?
-
这个查询是针对 Postgres 的。我想在 Microsoft SQL 上创建。
标签: sql sql-server postgresql database-migration