将视图从 SQL 服务器转换为 Postgresql?
Convert a view from SQL Server to Postgresql?
我在 SQL 服务器数据库中有一个视图,我想将此视图转换为 Postgresql 视图我尝试了更多次,但每次都出现语法错误。
你能不能看看我的 sql 并帮助我如何转换它?
CREATE VIEW dbo.View_RtbActiveSitePlacesCtrWeekly
AS
SELECT
Id,
CASE WHEN Shows > 0 THEN CASE WHEN Clicks > 0 THEN Clicks ELSE 1 END / CAST(Shows AS float) * 100 ELSE 0 END AS CTR,
ShowsCost / 1000 / CASE WHEN Clicks > 0 THEN Clicks ELSE 1 END AS AvClickCost, CASE WHEN Shows > 0 THEN ShowsCost / Shows ELSE 0 END AS AvCpm,
CASE WHEN Clicks > 0 THEN 0 ELSE 1 END AS IsCtrPredicted, ClicksCost - ShowsCost / 1000 AS Balance
FROM
(SELECT
p.Id,
ISNULL(SUM(st.ClicksCount), 0) AS Clicks,
ISNULL(SUM(st.ShowsCount), 0) AS Shows,
ISNULL(SUM(st.ShowsCost), 0) AS ShowsCost,
ISNULL(SUM(st.ClicksCost), 0) AS ClicksCost
FROM
whis2011.dbo.RtbActiveSitePlaces AS p
OUTER APPLY
(SELECT TOP (30)
RtbActiveSitePlaceId pId, Date, ShowsCount, ShowsCost,
ClicksCount, ClicksCost
FROM
whis2011.dbo.RtbActiveSitePlaceStatistics
WHERE
RtbActiveSitePlaceId = p.Id
AND Date >= '2016-05-01 00:00:00.000'
AND (ShowsCount > 0 OR ClicksCount > 0)
ORDER BY
Date DESC) AS st
WHERE
p.LastAccess >= DATEADD(dd, - 1, GETDATE())
GROUP BY p.Id) t;
您不能将 table 称为 whis2011.dbo.RtbActiveSitePlaces
或 whis2011.dbo.RtbActiveSitePlaceStatistics
。在 PostgreSQL 中你只能使用 schema_name.table_name
.
而不是 ISNULL()
,您应该使用 coalesce()
函数,它具有相同的格式。
OUTER APPLY
在 PostgreSQL 中不存在,请改用 JOIN LATERAL
。但看起来你可以定期 JOIN
.
使用ORDER BY date LIMIT 30
代替TOP (30)
。
而不是 DATEADD(...)
写 CURRENT_DATE - 1
.
总而言之,你应该得到这样的结果:
CREATE VIEW dbo.View_RtbActiveSitePlacesCtrWeekly AS
SELECT Id,
CASE WHEN Shows > 0
THEN CASE WHEN Clicks > 0 THEN Clicks ELSE 1 END / Shows::float * 100
ELSE 0 END AS CTR,
ShowsCost / 1000 / CASE WHEN Clicks > 0 THEN Clicks ELSE 1 END AS AvClickCost,
CASE WHEN Shows > 0 THEN ShowsCost / Shows ELSE 0 END AS AvCpm,
NOT (Clicks > 0) AS IsCtrPredicted,
ClicksCost - ShowsCost / 1000 AS Balance
FROM (
SELECT p.Id,
coalesce(SUM(st.ClicksCount), 0) AS Clicks,
coalesce(SUM(st.ShowsCount), 0) AS Shows,
coalesce(SUM(st.ShowsCost), 0::money) AS ShowsCost,
coalesce(SUM(st.ClicksCost), 0::money) AS ClicksCost
FROM whis2011.RtbActiveSitePlaces AS p
JOIN (
SELECT RtbActiveSitePlaceId pId, Date, ShowsCount, ShowsCost,
ClicksCount, ClicksCost
FROM whis2011.RtbActiveSitePlaceStatistics
WHERE Date >= '2016-05-01'::date
AND (ShowsCount > 0 OR ClicksCount > 0)
ORDER BY Date DESC LIMIT 30) AS st ON st.RtbActiveSitePlaceId = p.Id
WHERE p.LastAccess >= CURRENT_DATE - 1
GROUP BY p.Id) t;
我在 SQL 服务器数据库中有一个视图,我想将此视图转换为 Postgresql 视图我尝试了更多次,但每次都出现语法错误。
你能不能看看我的 sql 并帮助我如何转换它?
CREATE VIEW dbo.View_RtbActiveSitePlacesCtrWeekly
AS
SELECT
Id,
CASE WHEN Shows > 0 THEN CASE WHEN Clicks > 0 THEN Clicks ELSE 1 END / CAST(Shows AS float) * 100 ELSE 0 END AS CTR,
ShowsCost / 1000 / CASE WHEN Clicks > 0 THEN Clicks ELSE 1 END AS AvClickCost, CASE WHEN Shows > 0 THEN ShowsCost / Shows ELSE 0 END AS AvCpm,
CASE WHEN Clicks > 0 THEN 0 ELSE 1 END AS IsCtrPredicted, ClicksCost - ShowsCost / 1000 AS Balance
FROM
(SELECT
p.Id,
ISNULL(SUM(st.ClicksCount), 0) AS Clicks,
ISNULL(SUM(st.ShowsCount), 0) AS Shows,
ISNULL(SUM(st.ShowsCost), 0) AS ShowsCost,
ISNULL(SUM(st.ClicksCost), 0) AS ClicksCost
FROM
whis2011.dbo.RtbActiveSitePlaces AS p
OUTER APPLY
(SELECT TOP (30)
RtbActiveSitePlaceId pId, Date, ShowsCount, ShowsCost,
ClicksCount, ClicksCost
FROM
whis2011.dbo.RtbActiveSitePlaceStatistics
WHERE
RtbActiveSitePlaceId = p.Id
AND Date >= '2016-05-01 00:00:00.000'
AND (ShowsCount > 0 OR ClicksCount > 0)
ORDER BY
Date DESC) AS st
WHERE
p.LastAccess >= DATEADD(dd, - 1, GETDATE())
GROUP BY p.Id) t;
您不能将 table 称为
whis2011.dbo.RtbActiveSitePlaces
或whis2011.dbo.RtbActiveSitePlaceStatistics
。在 PostgreSQL 中你只能使用schema_name.table_name
.而不是
ISNULL()
,您应该使用coalesce()
函数,它具有相同的格式。OUTER APPLY
在 PostgreSQL 中不存在,请改用JOIN LATERAL
。但看起来你可以定期JOIN
.使用
ORDER BY date LIMIT 30
代替TOP (30)
。而不是
DATEADD(...)
写CURRENT_DATE - 1
.
总而言之,你应该得到这样的结果:
CREATE VIEW dbo.View_RtbActiveSitePlacesCtrWeekly AS
SELECT Id,
CASE WHEN Shows > 0
THEN CASE WHEN Clicks > 0 THEN Clicks ELSE 1 END / Shows::float * 100
ELSE 0 END AS CTR,
ShowsCost / 1000 / CASE WHEN Clicks > 0 THEN Clicks ELSE 1 END AS AvClickCost,
CASE WHEN Shows > 0 THEN ShowsCost / Shows ELSE 0 END AS AvCpm,
NOT (Clicks > 0) AS IsCtrPredicted,
ClicksCost - ShowsCost / 1000 AS Balance
FROM (
SELECT p.Id,
coalesce(SUM(st.ClicksCount), 0) AS Clicks,
coalesce(SUM(st.ShowsCount), 0) AS Shows,
coalesce(SUM(st.ShowsCost), 0::money) AS ShowsCost,
coalesce(SUM(st.ClicksCost), 0::money) AS ClicksCost
FROM whis2011.RtbActiveSitePlaces AS p
JOIN (
SELECT RtbActiveSitePlaceId pId, Date, ShowsCount, ShowsCost,
ClicksCount, ClicksCost
FROM whis2011.RtbActiveSitePlaceStatistics
WHERE Date >= '2016-05-01'::date
AND (ShowsCount > 0 OR ClicksCount > 0)
ORDER BY Date DESC LIMIT 30) AS st ON st.RtbActiveSitePlaceId = p.Id
WHERE p.LastAccess >= CURRENT_DATE - 1
GROUP BY p.Id) t;