我在SQL Server数据库中有一个视图,我想将此视图转换为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;
答案 0 :(得分:0)
您无法将表格称为whis2011.dbo.RtbActiveSitePlaces
或whis2011.dbo.RtbActiveSitePlaceStatistics
。在PostgreSQL中,您只能使用schema_name.table_name
。
您应该使用ISNULL()
函数,而不是coalesce()
,否则格式相同。
OUTER APPLY
,而是使用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;