在 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 中查找按日期分组的集合中的平均最低项的主要内容,如果未能解决你的问题,请参考以下文章

SQL的一些查询语句

如何根据每周日期创建移动平均线,按data.table中的多列分组?

如何按 ID 分组并查找日期中的空白以确定 Alteryx 中的开始和结束日期?

按日期分组Java

pandas DataFrame中按日期(在索引中)的加权平均分组(每列不同的操作)

如何通过 SQL Server 中的分组列根据日期列的最近 3 个月获取列平均值?