sql - 如何通过固定一些变量来计算中位数?
问题描述
我有一个已经汇总的数据集。这基本上显示了每天每只猫、root_cat 和集群的中位数价格。
date cluster root_cat cat median_price
2020-12-07 A X 1 20
2020-12-07 A X 2 15
2020-12-07 A X 2 30
2020-12-08 B Y 3 24
这是我为计算中位数价格而编写的查询。
SELECT date,
page_impressions_cluster,
root_cat,
cat,
MAX(CASE
WHEN tile2 = 1 THEN
min_price/100 END) AS median
FROM
(SELECT pl.*,
NTILE(2)
OVER (PARTITION BY product_id
ORDER BY min_price) AS tile2
FROM pl
WHERE cluster is NOT null
AND (date_parse(date, '%Y-%m-%d') >= current_date - interval '15' day) ) d
GROUP BY 1, 2, 3, 4
现在,我想再增加一列,显示除最近一天之外的每只猫和 root_cat 过去 14 天的中位数价格。我怎样才能做到这一点?
这是所需的输出:
date cluster root_cat cat median_price median_price_root median_price_cat
2020-12-07 A X 1 20 20 20
2020-12-07 A X 2 15 20 22,5
2020-12-07 A X 2 30 20 22,5
2020-12-08 B Y 3 24 24 24
解决方案
如果中位数的近似值足够好,那么您可以使用
SELECT date,
page_impressions_cluster,
root_cat,
cat,
MAX(CASE
WHEN tile2 = 1 THEN
min_price/100 END) AS median,
approx_percentile(price, 0.5) -- <<== the 0.5 percentile is the median
FROM ...
请参阅此处approc_percentile
的功能文档。
推荐阅读
- android - 后台执行不允许接收意图 BOOT_COMPLETED
- c# - Selenium - 通过谷歌帐户登录(空白,白色窗口)
- php - Microsoft 图表 - 无法向我的消息添加附件
- c# - 有人可以使用 C# 统一代码在我的测验游戏中帮助我吗
- javascript - Vue关于Reactivity in Depth,为什么Vue可以这样检测属性添加?
- python - 正则表达式匹配问题与 \d* 和 |
- angularjs - 将日期与最小值和最大值进行比较不起作用
- c# - XAML - PostAsync 将空数据发送到数据库
- prestashop - 在移动设备中查看 prestashop 页面时,如何用 html 数据填充 _mobile_* div
- memory-leaks - 这段代码对内存泄漏安全吗