SQL 仅从当月选择记录

Posted

技术标签:

【中文标题】SQL 仅从当月选择记录【英文标题】:SQL Select Records From Current Month Only 【发布时间】:2018-06-20 15:57:12 【问题描述】:

我正在尝试编写一个查询,该查询返回在某个日期范围内仅存在一次的记录。此表中可以有多个具有不同日期的相同记录。例如:

Field |   Date
------------------
  A   | 2016-04-01
  A   | 2017-06-01
  A   | 2018-06-01
  B   | 2017-06-01
  B   | 2018-06-01
  C   | 2018-06-01

在这个例子中,我只想让查询返回行:

Field |   Date
------------------
  C   | 2018-06-01

因为没有其他字段值为“C”且日期更早的行。我不能简单地在表中查询大于某个值的日期,因为可能存在与该条件匹配但具有与先前日期值相同的记录的记录。我只想返回只存在一次的记录。这是一个 DB2 表,这个查询最终会被构建到一个 SQLRPGLE 程序中。

有人对最好的方法有什么建议吗?

谢谢!

【问题讨论】:

你的问题不是很清楚。你说“可以有多个相同的记录”,但你又说它们“有不同的日期”。如果两件事是相同的,那么它们(根据定义)没有区别..即在您的示例中,没有相同的记录!无论如何我很困惑......其他人我的公平更好! 当我说“相同的记录”时,我的意思是除了日期之外,这些记录在各方面都是相同的。所有字段完全相同,只是日期值不同。 好的。所以亚历山大的答案就是你想要的。只需按所有字段分组(在本例中您只有 1 个字段) 【参考方案1】:

您可以按Field 分组并获取仅出现一次的字段。在这里我选择max(Date),因为我不想按它分组。由于它是组中唯一的日期,max() 函数返回日期本身。

declare @from_date date = '20180101', @to_date date = '20180201'

select Field
       max(Date) Date
from   my_table
where  Date between @from_date and @to_date
group by Field
having count(Date) = 1

编辑:@from_date 和 @to_date 设置为 datetime 类型,改为设置为 date。谢谢@Clockwork-Muse!

【讨论】:

请don't use BETWEEN with date/time types。【参考方案2】:

在内部查询中使用 Group by:

SELECT * 
FROM MY_TABLE 
WHERE field 
IN 
    (SELECT field FROM MY_TABLE GROUP BY field HAVING COUNT(*)=1) 
    AND date_ts >= '2016-01-01' 
    AND date_ts < '2019-01-01'

【讨论】:

【参考方案3】:

选择 * 从表 x 其中月份(x.date)=月份(当前日期) 和年(x.date)=年(当前日期);

【讨论】:

这行不通。这仅选择当前月份和年份中存在的记录。它不排除存在较早日期的相同记录。在上面的示例中,此查询将选择字段为 A、B 和 C 的记录。我只想获取 C。

以上是关于SQL 仅从当月选择记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询帮助:选择当月的随机员工

如何确保仅从特定表中选择第一条记录,该表可以在 DB2 中包含多个相同 ID 的记录

对相关记录进行分组,但仅从第一条记录中选择某些字段

仅从表中选择最新记录并使其快速,如何?

内部联接仅从第二个表中选择基于日期的一行

sqlserver查询当月记录