SQL获取每个月的数据集中的最大日期

时间:2009-11-23 22:38:27

标签: sql sql-server sql-server-2005

我有一个包含INT id和DATETIME日期的表,以及其他字段。每个工作日都会在此表中插入行(不保证),其他几个表使用此id作为外键。

我的问题是,如何获取每月最大日期的ID,然后我可以使用它来加入其他数据表?例如,如果今天流程运行,我希望看到1月31日,2月28日,...,10月31日,11月23日的数据。

我正在使用SQL Server 2005。

4 个答案:

答案 0 :(得分:5)

CREATE TABLE #foo (id INT, d DATETIME);

INSERT #foo(id,d) SELECT 1, '20091101'
UNION ALL SELECT 2, '20091102'
UNION ALL SELECT 3, '20091006'
UNION ALL SELECT 4, '20091001'
UNION ALL SELECT 5, '20091002'
UNION ALL SELECT 6, '20090904';

SELECT d, id
FROM 
( 
  SELECT d, id, rn = ROW_NUMBER() OVER 
  (PARTITION BY DATEDIFF(MONTH, '20000101', d)
   ORDER BY d DESC)
  FROM #foo
) AS x
WHERE x.rn = 1
ORDER BY x.d;

DROP TABLE #foo;

答案 1 :(得分:3)

这将拉出月份和年份以及最后一个ID:

SELECT month(date), year(date), max(id)
FROM mytable
GROUP BY month(date), year(date)

这是一个测试脚本

create table #mytable (
date datetime,
id int
)

insert into #mytable (date, id) values ('11/7/2009', 1)
insert into #mytable (date, id) values ('11/8/2009', 2)
insert into #mytable (date, id) values ('12/21/2009', 3)
insert into #mytable (date, id) values ('12/30/2009', 4)
insert into #mytable (date, id) values ('10/7/2009', 5)
insert into #mytable (date, id) values ('10/12/2009', 6)

SELECT month(date), year(date), max(id)
FROM #mytable
GROUP BY month(date), year(date)

drop table #mytable

答案 2 :(得分:2)

我假设你只想要一个月的最后一天你有记录(例如1月30日如果你在1月31日什么都没有的话)。

SELECT
  id,
  date
FROM (
  SELECT
    id,
    date,
    ROW_NUMBER() OVER (PARTITION BY YEAR(date), MONTH(date) ORDER BY DAY(date) DESC) AS rowNum
  FROM sometable
) z
WHERE rowNum = 1;

答案 3 :(得分:1)

我会使用按查询分组选择最长日期,如下所示:

Select Year(datetimefield) as MyYear, month(datetimefield) as MyMonth max(day(datetimefield)) as MaxDate
from table1
group by Year(datetimefield), month(datetimefield)

上面的查询将返回每个月的最长交易日期。要获取与每个月的该日期相关联的最大ID,请将此结果返回到源表以获取该日的最大ID。

因此,您的完整查询将如下所示:

select  year(datetimefield) as MyYear, Month(datetimefield) as MyMonth, day(datetimefield), max(IdFieldName) as MaxID
from someTable inner join 
    (select  year(datetimefield) as MyYear, Month(datetimefield) as MyMonth,     max(day(datetimefield)) as MaxDate
    from someTable 
    group by year(datetimefield), Month(datetimefield)) as innerSelect
on innerselect.MyYear = year(datetimefield) and 
    innerselect.MyMonth = Month(datetimefield) and
    innerselect.MaxDate = day(datetimefield)
group by year(datetimefield), Month(datetimefield), day(datetimefield)