【问题标题】:select rows with all min values and next max value of given value选择具有所有最小值和给定值的下一个最大值的行
【发布时间】:2021-09-10 01:31:31
【问题描述】:

我需要从 postgresql 中获取数据,我需要在以下条件下选择行。

id  type  total_quantity created_dttm [desc]

1    1    12            27-Jun-2021
2    1    32            26-Jun-2021
3    1    52            25-Jun-2021

需要在查询中获取与给定值匹配的所有行。如果我将值设为 24 ,那么我需要获取所有行

所以我只需要得到两行..

id  type  total_quantity created_dttm [desc]

1    1    12            27-Jun-2021
2    1    32            26-Jun-2021

我尝试了两列的总和,但这不起作用,因为我正在寻找一个值范围之间的行,并且有条件选择所有小于给定值的行 + 选择给定值的下一个最大值..给定类型...

编辑:- 查询必须根据 created_dttm desc 的类型和顺序获取

【问题讨论】:

  • 什么是“下一个最大值”?

标签: sql postgresql postgresql-9.5


【解决方案1】:

如果您的数量正在减少,请使用lead():

select t.*
from (select t.*,
             lead(total_quantity) over (order by created_dttm) as next_total_quantity
      from t
     ) t
where next_total_quantity is null or
      next_total_quantity <= 24;

Here 是一个 dbfiddle。

【讨论】:

  • lead() 或 lag() 函数的作用是什么?
  • @pappu_kutty 此答案不会返回您的预期结果:dbfiddle.uk/…
  • @Gordon,您能对此发表评论吗...,在我的 pdAdmin 中,您的解决方案按预期工作,但如前所述,它不起作用.. 在这里看起来很可疑
  • @pappu_kutty 。 . .我在解释中加入了铅,然后没有包括那个版本。我编辑了答案并提供了一个 SQL Fiddle(好吧,感谢将它放在一起的 forpas)。
【解决方案2】:

使用MIN() 窗口函数,您可以获得大于24 的每个type 的最小值total_quantity:

SELECT id, type, total_quantity, created_dttm
FROM (
  SELECT *, MIN(total_quantity) FILTER (WHERE total_quantity > 24) OVER (PARTITION BY type) qty
  FROM tablename
) t
WHERE total_quantity <= qty

如果您只需要type = 1 的结果:

SELECT id, type, total_quantity, created_dttm
FROM (
  SELECT *, MIN(total_quantity) FILTER (WHERE total_quantity > 24) OVER () qty
  FROM tablename
  WHERE type = 1
) t
WHERE total_quantity <= qty

或者:

SELECT *
FROM tablename
WHERE type = 1 
  AND total_quantity <= (SELECT MIN(total_quantity) FROM tablename WHERE total_quantity > 24)

请参阅demo。

【讨论】:

  • 这个查询让我得到所有类型的行,但我需要得到一种类型..
  • @pappu_kutty 然后添加一个 WHERE 子句:WHERE type = 1
  • 我尝试了 type=1 的查询,但它没有返回任何行.. 它给了我空
  • @pappu_kutty 您接受了一个返回错误结果的答案。现在你告诉我我的回答没有返回你预期的结果?我提供了一个演示:dbfiddle.uk/…
  • 对不起..这个查询工作完美..我认为这两个查询都可以按我的意愿工作。
猜你喜欢
  • 2021-08-14
  • 2014-12-01
  • 2017-12-17
  • 1970-01-01
  • 2018-10-06
  • 2019-08-05
  • 2018-08-24
  • 2020-09-09
  • 1970-01-01
相关资源
最近更新 更多