如何从每个分区获取最大日期值

时间:2013-10-02 18:21:58

标签: tsql database-partitioning

我创建了一个分区表,该分区表根据某个字段的年份进行分区

e.g. partition 1 - Year 2011 |
     partition 2 - Year 2012 |
     partition 3 - Year 2013

如何显示每个分区的最大日期

e.g. partition 1 - 2011/12/15 |
     partition 2 - 2012/12/25 |
     partition 3 - 2013/12/16

3 个答案:

答案 0 :(得分:1)

只需将您用于分区表的字段中的年份分组。更具体地说,您可以使用:

select year(my_date_field), max(my_date_field) 
from my_partitioned_table 
group by year(my_date_field)
order by year(my_date_field)

上面的顺序不是必需的,但会为您提供一个排序很好的结果集。

答案 1 :(得分:0)

使用max()功能( Example )。

Select max(y1) y1, max(y2) y2, max(y3) y3
From t

答案 2 :(得分:0)

让我再试一次。现在我认为下面的这个问题可以解决问题:

SELECT year(cast(rv.value as date)) _year,
      p.partition_number,
      max_date

FROM sys.partitions p
JOIN sys.indexes i 
      ON (p.object_id = i.object_id AND p.index_id = i.index_id)
JOIN sys.partition_schemes ps
      ON (ps.data_space_id = i.data_space_id)
JOIN sys.partition_functions f
      ON (f.function_id = ps.function_id)
LEFT JOIN sys.partition_range_values rv   
      ON (f.function_id = rv.function_id AND p.partition_number = rv.boundary_id)
JOIN sys.destination_data_spaces dds
      ON (dds.partition_scheme_id = ps.data_space_id
          AND dds.destination_id = p.partition_number)
JOIN sys.filegroups fg
      ON (dds.data_space_id = fg.data_space_id)
INNER JOIN (
    select year([partitioncol]) year, 
            max([partitioncol]) max_date 
    from TABLE1 group by year([partitioncol]) 
) table1
ON (table1.year=year(cast(rv.value as date)))
WHERE i.index_id < 2
      AND i.object_id = Object_Id('TABLE1')

通过我的测试数据(我将在下面解释如何设置),我得到了这些结果:

_year   partition_number    max_date
2011    1                   2011-12-31 08:00:16.920
2012    2                   2012-12-31 08:00:13.397
2013    3                   2013-10-02 08:00:10.660

此处的密钥系统表为 sys.partition_range_values 。它为我们与原始agreggation查询连接的每个分区提供了范围值,该查询返回每年的最大日期。

要重现我的结果,请按照以下链接中的说明操作(这是关于创建分区表的帖子)。这将创建并填充TABLE1。

http://www.mssqltips.com/sqlservertip/2888/how-to-partition-an-existing-sql-server-table/

然后在我的帖子的开头处运行查询。我根据以下链接提供的查询对其进行了调整:

http://www.sqlsuperfast.com/post/2011/02/22/T-SQL-Get-Partition-Details.aspx