将mySQL查询翻译成Postgres

时间:2018-07-20 12:52:49

标签: mysql postgresql postgresql-9.5

我无法编写Postgres查询。我总是会出错或得到错误的结果。我尝试比较今天和昨天之间的计数。

MySQL查询工作正常:

SELECT
    DATE_FORMAT(crh.date, '%d-%m-%Y') AS name,
    DATE_FORMAT(crh.date, '%Y-%m-%d') AS nameGroup,
    COUNT(crh.id) AS turnover,
    crh_.name AS nameChr,
    crh_.nameGroup AS nameGroupChr,
    crh_.turnover AS turnoverChr
FROM
    camera_reports_history AS crh
LEFT JOIN(
    SELECT DATE_FORMAT(crh_.date, '%d-%m-%Y') AS name,
        DATE_FORMAT(crh_.date, '%Y-%m-%d') AS nameGroup,
        COUNT(crh_.id) AS turnover
    FROM
        camera_reports_history AS crh_
    WHERE
        crh_.date >= '2018-07-09 00:00:00' AND crh_.date <= '2018-07-20 14:02:22'
    GROUP BY
        nameGroup
) AS crh_
ON
    crh_.nameGroup = DATE_FORMAT(SUBDATE(crh.date, 1),
    '%Y-%m-%d')
WHERE
    crh.date >= '2018-07-10 00:00:00' AND crh.date <= '2018-07-20 14:02:22'
GROUP BY
    nameGroup

结果:

"10-07-2018","2018-07-10","418","09-07-2018","2018-07-09","581"
"11-07-2018","2018-07-11","389","10-07-2018","2018-07-10","418"
"12-07-2018","2018-07-12","453","11-07-2018","2018-07-11","389"
"13-07-2018","2018-07-13","401","12-07-2018","2018-07-12","453"
...

我的PostgreSQL查询如下:

SELECT
    to_char(crh."date", 'DD-MM-YYYY') AS name,
    to_char(crh."date", 'YYYY-MM-DD') AS nameGroup,
    COUNT(crh.id) AS turnover,
    crh_.name AS nameChr,
    crh_.nameGroup AS nameGroupChr,
    crh_.turnover AS turnoverChr
FROM
    camera_reports_history AS crh
LEFT JOIN(
    SELECT to_char(crh_."date", 'DD-MM-YYYY') AS name,
        to_char(crh_."date", 'YYYY-MM-DD') AS nameGroup,
        COUNT(crh_.id) AS turnover
    FROM
        camera_reports_history AS crh_
    WHERE
        crh_.date >= '2018-07-09 00:00:00' AND crh_.date <= '2018-07-20 14:02:22'
    GROUP BY
        nameGroup,
        name
    ORDER BY
        nameGroup
) AS crh_
ON
    crh_.nameGroup = to_char(
        crh."date" - INTERVAL '1 day',
        'YYYY-MM-DD'
    )
WHERE
    crh.date >= '2018-07-10 00:00:00' AND crh.date <= '2018-07-20 14:02:22'
GROUP BY
    nameGroup,
    name
ORDER BY
    nameGroup

错误:

ERROR: column `crh.date` must appear in the GROUP BY clause or be used in an aggregate function

如果我插入必要的列:

GROUP BY nameGroup, name, date, crh_.nameGroup, crh_.name, crh_.turnover 

我会得到无用的结果。 有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

我找到了解决方法:

SELECT 
    DISTINCT ON(nameGroup) 
    to_char(crh."date", 'DD-MM-YYYY') AS name,
    to_char(crh."date", 'YYYY-MM-DD') AS nameGroup,
    crh__.turnover AS turnover,
    crh_.name AS nameChr,
    crh_.nameGroup AS nameGroupChr,
    crh_.turnover AS turnoverChr
FROM
    camera_reports_history AS crh
LEFT JOIN(
    SELECT 
        to_char(crh__."date", 'YYYY-MM-DD') AS nameGroup__,
        COUNT(crh__.id) AS turnover
    FROM
        camera_reports_history AS crh__
    WHERE
        crh__.date >= '2018-07-10 00:00:00' AND crh__.date <= '2018-07-20 14:02:22'
    GROUP BY
        nameGroup__
) AS crh__ ON crh__.nameGroup__ = to_char((crh."date"), 'YYYY-MM-DD')
LEFT JOIN(
    SELECT to_char(crh_."date", 'DD-MM-YYYY') AS name,
        to_char(crh_."date", 'YYYY-MM-DD') AS nameGroup,
        COUNT(crh_.id) AS turnover
    FROM
        camera_reports_history AS crh_
    WHERE
        crh_.date >= '2018-07-09 00:00:00' AND crh_.date <= '2018-07-20 14:02:22'
    GROUP BY
        nameGroup,
        name
    ORDER BY
        nameGroup
) AS crh_ ON crh_.nameGroup = to_char((crh."date" - INTERVAL '1 day'), 'YYYY-MM-DD')
WHERE
    crh.date >= '2018-07-10 00:00:00' AND crh.date <= '2018-07-20 14:02:22'
GROUP BY
    nameGroup,
    name,
    crh.date,
    crh__.turnover,
    crh_.nameGroup,
    crh_.name,
    crh_.turnover
ORDER BY
    nameGroup

我进行第二次LEFT JOIN计数结果,并在主DISTINCT ON(nameGroup)上使用SELECT

我认为这不是一个完美的查询。但是我的问题现在已经解决了。 请随时优化此查询。

答案 1 :(得分:-1)

事务块在postgresql中可以很好地工作,因此可以使用临时表来代替试图一次对所有对象进行排序,联接,分组和过滤的复杂复合语句。这使您可以将步骤分解为多个简单的语句,并将中间数据存储在临时表中,这些临时表在事务块的末尾消失。

我认为您会发现此方法易于调试。