我在一个包含每周日期的表中有一组日期。
我想选择以下内容:
如果日期小于2个月,则我希望选择所有日期(每周(。
如果日期大于2个月,则我只想选择每个月(每月(的最后一个日期。
我尝试了以下代码:
SELECT DISTINCT(Date) FROM [Table] WHERE Date IN
(CASE
WHEN Date> DATEADD(month, -2, GETDATE())
THEN Date
ELSE MAX(Date) GROUP BY Month(Date),Year(Date)
);
但没有成功:
关键字"GROUP"附近的语法不正确。
例如,如果当前日期为2022年9月13日,
2022年9月13日-2个月=2022年7月13日
如果我的表中有以下日期:
06/05/2022
2022年5月13日
2022年5月20日
2022年5月31日
2022年6月7日
2022年6月10日
2022年6月17日
2022年6月24日
2022年6月30日
08/07/2022(<13/07/2022(
2022年7月15日(>2022年7日13日(
2022年7月22日
2022年7月29日
2022年8月5日
2022年8月12日
2022年8月19日
2022年8月26日
那么最终输出应该是:
2022年5月31日
2022年6月30日(<2022年7月13日(
2022年7月15日(>2022年7日13日(
2022年7月22日
2022年7月29日
2022年8月5日
2022年8月12日
2022年8月19日
2022年8月26日
您的语法完全无效,我不想麻烦修复它。
DISTINCT
不是一个函数,它适用于整个列集- 不能在
WHERE
内部使用聚合,即使它们是窗口函数(它们不是( GROUP BY
在CASE
内部,这毫无意义
相反,我只是偏离了你的要求
- 如果日期小于2个月,则我希望选择所有日期(每周(
- 如果日期超过2个月,那么我只想选择每个月(每月(的最后一个日期
您可以为此使用ROW_NUMBER
策略。
SELECT
t.Date
FROM (
SELECT *,
rn = ROW_NUMBER() OVER (PARTITION BY EOMONTH(t.Date) ORDER BY t.Date DESC)
FROM [Table] t
) t
WHERE (
t.Date > DATEADD(month, -2, GETDATE())
OR rn = 1
)
ORDER BY
Date;