将视图从 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.RtbActiveSitePlaceswhis2011.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;