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 useBETWEEN
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 仅从当月选择记录的主要内容,如果未能解决你的问题,请参考以下文章