在WHERE子句中选择最小日期

问题描述 投票:1回答:2

从PostgreSQL的角度来看:我有一个数据集,它包含指标值,时间戳和一个标志,用于表示指标值是否与基线或后续期有关。

我想选择基线期间的所有行和后续期间的第一行。我无法在WHERE子句中使用MIN(日期),并且并非后续时间段始终在所有情况下都在同一天开始。

有没有办法可以做像WHERE type = 'baseline' OR (type = 'fol' AND date <= MIN(date))这样的事情?

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

postgresql superset apache-superset
2个回答
1
投票

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

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

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)

我没有运行这些查询


推荐问答