【问题标题】:get median in overlap time range获得重叠时间范围的中位数
【发布时间】:2016-07-15 00:34:30
【问题描述】:

例如,vertica db 有一个名为revenue 的表:

date             revenue
2016-07-12          1
2016-07-12          10
2016-07-12          5
2016-07-12          3
2016-07-13          7
2016-07-13          120
2016-07-13          22
2016-07-14          5
2016-07-14          17

棘手的是我不希望每个日期的中位数,但我想计算时间范围的中位数收入 >= 每天给定,例如结果将是:

daterange       median_revenue
>= 2016-07-12         7
>= 2016-07-13         17
>= 2016-07-14         11

要清楚:

7 = median(1,10,5,3,7,120,22,5,17)
17 = median(7,120,22,5,17)
11 = median(5,17)

如何为这些日期范围编写 sql 脚本?有没有简单的查询方法?我不想在每个日期范围中计算然后联合,因为有很多天。

【问题讨论】:

  • 用合理的期望结果编辑您的问题。
  • 在您使用您给我们的样本的预期结果中,您能否给出 xxx、yyy 和 zzz 的预期值?它们是记录 >= 那些日期的收入总和吗?
  • 嗨 Ashwin,它是中位数。我已经更新了。因为这个例子的样本很少,所以结果并不重要。只是想知道这个想法。

标签: sql vertica


【解决方案1】:

这会有帮助吗?

SELECT
    date_table.[date],
    MEDIAN (r.revenue) AS median_revenue
FROM 
    (SELECT DISTINCT [date] FROM revenue) date_table
LEFT JOIN revenue r ON r.[date] >= r_main.[date]
GROUP BY
    date_table.[date]

【讨论】:

  • 虽然你计算的是平均值,但是给我一些提示。看我下面的帖子
  • 我的错,错字
【解决方案2】:

刚刚发现

select distinct date, median(revenue) over (partition by date) as rev_median  
from (select a.date,b.revenue 
      from (select distinct date from revenue_test) a 
      left outer join revenue b 
           on a.date<=b.date order by a.date,b.date) a ;`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多