【问题标题】:Select Minimum Date within WHERE Clause在 WHERE 子句中选择最短日期
【发布时间】:2019-09-12 10:29:53
【问题描述】:

从 PostgreSQL 的角度来看: 我有一个数据集,其中包含指标值、时间戳和一个标志,用于表示指标值是属于基线还是后续期。

我想选择基线期的所有行和后续期的第一行。我不能在 WHERE 子句中使用 MIN(date),并不是说在所有情况下都将始终从同一日期开始跟踪期。

有没有办法让我做类似WHERE type = 'baseline' OR (type = 'fol' AND date <= MIN(date)) 的事情?

从超集的角度来看: 我正在使用注释层来突出显示代表基线期的指标线部分。然后我用不同的颜色突出显示后续期间。我需要确保突出显示是连续的(现在基线最后日期和后续最后日期之间的线段没有突出显示)。因此,我需要对基线突出显示注释层下的图表应用一个过滤器,该过滤器返回基线期和第一个后续日期的数据。

【问题讨论】:

    标签: postgresql superset apache-superset


    【解决方案1】:

    据我所知,有几种方法可以做到这一点:

    1) 使用 UNION 进行两个单独的查询

    select <Query> where type = 'baseline'
    UNION ALL
    select <Query> where type = 'fol' order by date limit 1
    

    2) 使用您编写的 where 子句,但在子查询中计算日期,如 @Kushal Arya 答案中的那样

    3) 使用窗口函数 ROW_NUMBER

    select
        <Query>,
        ROW_NUMBER() over (partition by type
                           order by date) as row_num
    where
      type = 'baseline' OR
      (type = 'fol' AND row_num = 1)
    

    我没有运行这些查询

    【讨论】:

    • 谢谢!由于我用的是Superset,所以window函数是最简单的
    【解决方案2】:

    您不能在 WERE 子句中使用聚合函数。改用子查询

    ... WHERE type = 'baseline' OR (type = 'fol' AND date <= (SELECT MIN(data) FROM ... WHERE type = 'baseline') )
    

    【讨论】:

    • 感谢您的回复。这绝对适用于测试。不幸的是,由于我正在使用数据可视化软件,使用下面的窗口功能的建议似乎最适合我的特定用例。
    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多