【问题标题】:Can we convert this sqlite query from using RANK() OVER( ) to using HAVING clause.?我们可以将这个 sqlite 查询从使用 RANK() OVER( ) 转换为使用 HAVING 子句吗?
【发布时间】:2021-05-05 09:59:42
【问题描述】:

我在一些旧代码中发现了这个查询,但无论如何我都不是一个有经验的 SQL/数据管理员,有人可以在不使用 rank() 函数的情况下将这个轮询变成一些基本的查询吗?

SELECT memberId, year, AVG(income) avg_income
FROM (
  SELECT *, RANK() OVER (PARTITION BY memberId ORDER BY year DESC) rnk
FROM income
 )
WHERE rnk = 1
GROUP BY memberId, year

此查询应该执行以下操作: 对于每个有工作的成员,请找到他们最近一年工作的avg_income

我们如何将一些使用rank() over 的“花哨”SQL 查询转换为使用HAVING 子句的语句?

【问题讨论】:

  • 有可能。请分享一些示例数据。
  • 我不知道我是否可以分享公司数据,我认为如果可能的话,它可以在没有数据的情况下完成,因为数据可以是任何东西,但想法/逻辑在这里更重要.感谢您的确认。

标签: sql sqlite window-functions


【解决方案1】:

请尝试以下查询并告诉我您的反馈:

SELECT memberId, year, AVG(income) avg_income
FROM income i
WHERE year =(select max(year) from income im where im.memnberid=i.memberid)
GROUP BY memberId, year

【讨论】:

  • 你能解释一下吗?感谢您的询问。既然现在我需要在它上面再添加一个约束,比如季度,在不了解查询的情况下,我们如何找到最近一年的最近一个季度?
  • 在以前的查询中,rank() 用于识别最近几年的所有收入。我使用子查询来查找任何特定成员的 max(year) 并在 where 子句中使用它。
  • 我现在明白了。我只是按memberId、年份、季度添加订单。
  • 很高兴知道。最良好的祝愿。
  • 如果您觉得我的回答对您有帮助,请点击绿色复选标记标记为已接受。
【解决方案2】:

对于此类查询,您始终可以使用exists/not exists,如下所示:

SELECT memberId, year, AVG(income) avg_income
FROM income i
WHERE NOT EXISTS
      (SELECT 1 FROM income ii where i.memberId = ii.memberId and ii.year > i.year)
GROUP BY memberId, year

【讨论】:

  • 感谢您的帮助,但是您当前的解决方案不起作用,但是您可以看看这个吗 可以请您也看看这个 SELECT memberId, year, Quarter, AVG(income) avg_income FROM ( SELECT *, RANK() OVER (PARTITION BY memberId ORDER BY year DESC, Quarter) rnk FROM income ) WHERE rnk = 1 GROUP BY sid, year, Quarter;
  • 你也有季度吗?它是从哪里出现的?
  • 是的,这个查询也有季度。我们可以假设它也来自收入表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 2021-11-10
  • 1970-01-01
相关资源
最近更新 更多