【问题标题】:Select for max date of the Inserted dates on every month选择每个月插入日期的最大日期
【发布时间】:2022-01-25 05:32:34
【问题描述】:

我有一个销售表,它在 sales_day 列中以日期格式包含每个销售日期。我需要从这些输入的日期中找到每个月的最大日期。我正在使用 oracle 数据库

【问题讨论】:

  • 请给出示例数据

标签: oracle


【解决方案1】:

您可以group by 月份并使用max 聚合:

select extract(month from sale_day) as month, max(sale_day) maxdate
from sales
group by extract(month from sale_day);

Fiddle

请注意,这将获取所有年份的日期,这可能不是您想要的。 如果您想将行限制在某一年:

select extract(month from sale_day) as month, max(sale_day) maxdate
from sales
where sale_day between TO_DATE('2021-01-01','YYYY-MM-DD') and 
TO_DATE('2021-12-31','YYYY-MM-DD')
group by extract(month from sale_day);

【讨论】:

  • 更喜欢使用范围查找而不是在 where 子句中操作表数据
  • @CaiusJard 编辑了我的答案!那是因为如果列被索引,它会执行得更快吗?没想到!
  • 最好按trunc(sale_date, 'mm') 分组(并选择)——这样可以将不同年份的月份分开。然后您可以根据需要在select 子句中对其进行格式化。
  • 如果列被索引,它会执行得更快吗? - 无法保证使用范围使用索引,但它是通常可以说,在 where 子句中操作表数据意味着不会使用索引 。数据库可能会看到您使用了一个范围并认为“该范围太大了,只读取表格会更快”。您可能还会看到“使用”索引,因为数据库可能会扫描整个索引(如果它认为它比扫描表更快)但不要搞错 - 扫描索引和在索引中执行查找是非常不同的.
  • 一般来说“如果你可以通过不在where子句中操作表数据来获得相同的东西,那么这样做”会更好地提高查询性能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多