在 SQL 中查找按日期分组的集合中的平均最低项
Posted
技术标签:
【中文标题】在 SQL 中查找按日期分组的集合中的平均最低项【英文标题】:Find the average lowest item in a collection grouped by date in SQL 【发布时间】:2021-06-23 13:17:45 【问题描述】:我的 SQL 不是最好的 - 我可以在 C# 中使用它,但在我的数据层中使用它似乎更有效 - 我有一个表 Prices
:
ID | Price | DateTime |
---|---|---|
每一行距下一行正好 1 小时,因此我每小时都有一个价格快照。
我正在尝试计算整个数据集中一天中哪个小时的价格最低(平均而言)。
因此,理想情况下,我会按照一天中每个小时在整个数据集中的平均便宜程度来排序 - 所以最多 24 行(一天中每个小时一个)。
任何帮助将不胜感激!
谢谢:D
【问题讨论】:
请阅读:How to Ask 【参考方案1】:您在哪个数据库上?
不同的数据库有不同的方法从时间戳列中提取日期。
Postgres 有date(timestamp)
,在Oracle 中可以使用trunc(timestamp)
。或者大多数数据库都有to_char/to_date
。所以你可以试试。
提取日期后,您可以尝试这样的操作 -
select ID,
Price,
DateTime,
trunc(DateTime) as day,
rank() over (partition by trunc(DateTime) order by Price asc) as least_for_day
from Prices
现在您可以使用“least_for_day”排名列并按天选择。
同样,根据数据库,您可以直接在同一 SQL 中的排名列上qualify
,也可以将上述内容用作子查询并过滤排名。
【讨论】:
感谢您的回复 - 非常感谢。我在 Microsoft SQL Server 2017 上 - 这适用吗?似乎有点工作,无论如何都要去做!【参考方案2】:您可以使用如下查询
select
hour,
avg(daily_rank) avg_rank
from
(
select *, hour= format((datetime as datetime),'HH'), daily_rank= dense_rank() over (partition by cast(datetime as date) order by price asc)
) t
group by hour
【讨论】:
感谢您的回复 - 这可以在 Microsoft SQL Server 2017 中使用吗?【参考方案3】:非常感谢@Many Manjunath 和@DhruvJoshi。最终解决方案如下;
WITH prices AS
(
SELECT
[Price],
[DateTime],
CAST([DateTime] AS TIME) 'Time',
CAST([DateTime] as date) 'Date',
rank() over (partition by cast([DateTime] as date) order by [Price] asc) as least_for_day
FROM [dbo].[Prices]
)
SELECT [Time], count(*) 'Qty Cheapest' FROM prices
WHERE least_for_day = 1
GROUP BY [Time]
ORDER BY 2 DESC
返回 24 行:
【讨论】:
以上是关于在 SQL 中查找按日期分组的集合中的平均最低项的主要内容,如果未能解决你的问题,请参考以下文章
如何根据每周日期创建移动平均线,按data.table中的多列分组?
如何按 ID 分组并查找日期中的空白以确定 Alteryx 中的开始和结束日期?