【问题标题】:Postgresql compare two select result on the same tablePostgresql比较同一张表上的两个选择结果
【发布时间】:2020-08-25 14:47:13
【问题描述】:

我比较两个选择的结果并得到 1 或 0 作为最终结果。 下面的查询语法很好,但是这个查询会导致超时。

SELECT (CASE WHEN (
            select count(*)  from order  where ordered_date > (NOW() - INTERVAL '120 minutes')  
            and order_ordered = current_date) >  
            (select count(*)/3  
                    from order  
                    where ordered_date > (NOW() - INTERVAL '2 days' - INTERVAL '120 minutes')  
                    and ordered_date < (NOW() - INTERVAL '2 days')) 
        THEN 1 ELSE 0 end);
    

因此,我尝试优化查询以对每个选择使用别名,如下所示:

select (case when a > b then 1 else 0 end) from (select count(*)  from order  where ordered_date > (NOW() - INTERVAL '120 minutes')  
            and order_ordered = current_date) as a,
            from (select count(*)/3  
                    from order  
                    where ordered_date > (NOW() - INTERVAL '2 days' - INTERVAL '120 minutes')  
                    and ordered_date < (NOW() - INTERVAL '2 days'))as b;

我在“from”附近有语法错误,在我的记忆中这种语法适用于 mysql。 你能否告诉我是否有可能通过在 Postgresql 上使用别名来使用两次“来自”,或者如果你知道我是一个接受者的另一种可能性。

示例:

第一个查询给出:select count(*) from order where ordered_date &gt; (NOW() - INTERVAL '120 minutes') and order_ordered = current_date -> 60

第二个查询给出:select count(*)/3 from order where ordered_date &gt; (NOW() - INTERVAL '2 days' - INTERVAL '120 minutes') and ordered_date &lt; (NOW() - INTERVAL '2 days') -> 20

最终条件:case when (60 > 20 then 1 else 0 end)

预期结果:1

谢谢

【问题讨论】:

  • 您不能只采用 MySQL 语法并在 Postgres 查询中使用它。除此之外,将示例输入数据与所需的输出一起包含在内将对您的问题有很大帮助。
  • @TimBiegeleisen,我添加了更多解释。提前致谢

标签: postgresql


【解决方案1】:

我建议使用SELECT in WITHhere 文档)。

WITH orders_current_date AS (
    SELECT count(*)
    FROM order
    WHERE ordered_date > (NOW() - INTERVAL '120 minutes')  
          AND order_ordered = current_date)
), orders_interval AS (
    SELECT count(*)/3
    FROM order
    WHERE ordered_date > (NOW() - INTERVAL '2 days' - INTERVAL '120 minutes')  
          AND ordered_date < (NOW() - INTERVAL '2 days')
)
SELECT
       CASE
           WHEN SELECT * FROM orders_current_date > SELECT * FROM orders_interval
                THEN '1'
           ELSE 
                0
       END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2022-11-14
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多