【问题标题】:Oracle SQL Developer - group by and count within specific dateOracle SQL Developer - 在特定日期内分组和计数
【发布时间】:2021-12-25 20:09:54
【问题描述】:

SQL 菜鸟,试图通过唯一名称分组获得一些帮助,提供计数,仅筛选 2021 年的开始日期。这就是我到目前为止所拥有的,也是我迷路的原因。

我的表:

| name     | start                           |
|----------|---------------------------------|
| Michigan | 01-JAN-21 01.00.00.000000000 AM |
| State    | 01-JAN-20 01.00.00.000000000 AM |
| State    | 01-JAN-21 01.00.00.000000000 AM |
| State    | 01-FEB-21 01.00.00.000000000 AM |
| Indiana  | 01-FEB-21 01.00.00.000000000 AM |
| Michigan | 01-FEB-21 01.00.00.000000000 AM |
| State    | 01-MAR-21 01.00.00.000000000 AM |

尝试获取名称的计数,仅针对 2021 年开始日期进行过滤。这就是我希望我的输出的样子:

| name     | Count |
|----------|-------|
| Michigan | 2     |
| State    | 3     |
| Indiana  | 1     |

我的代码:

select name, count(name) from my_table
group by name, start
having start >= '01-JAN-21 01.00.00.000000000 AM'

但这会重复名称(由于唯一的开始日期)并且不提供汇总计数。我无法通过“开始”删除组,因为这会在 SQL 中输出错误。所以我不确定如何达到我希望输出的样子。非常感谢一些指导。

【问题讨论】:

标签: sql date filter group-by count


【解决方案1】:

Having是分组后过滤,这样你就可以根据聚合进行cN过滤,这里可以先分组前过滤,所以使用where。

从组中删除 Start by,您只需要名称。

有一个函数可以用来从日期获取年份, https://docs.oracle.com/javadb/10.8.3.0/ref/rrefyearfunc.html

Select name, count(name)
From my_table
where year(start) = 2021
Group by name

或者如果 start 是 char 或 varchar 那么你可以这样做

Select name, count(name)
From my_table
where substr(start, 8, 2) = '21'
Group by name

【讨论】:

  • 感谢您的快速响应!我在代码的年份(开始)部分收到错误:ORA-00904: "YEAR": invalid identifier 00904. 00000 - "%s: invalid identifier" -- 我需要转换为日期时间还是某物?我认为这没有必要,因为它已经是 ISO 日期格式了?
  • 是的,如果 start 是 char 字段,则将其转换为日期时间。或者不使用年份,而是使用子字符串获取第 8-9 个字符并检查它们是否为 '21'
  • 也许你的意思是EXTRACT(而不是year)?
猜你喜欢
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2017-03-15
相关资源
最近更新 更多