我创建了一个分区表,它根据某个字段的年份进行分区
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
我创建了一个分区表,它根据某个字段的年份进行分区
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
只需在用于分区表的字段中按年份对记录进行分组。更具体地说,您可以使用它:
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)
上面的 order by 不是必需的,但会为您提供有序的结果集。
让我再尝试一次。现在我认为下面的这个查询可以解决问题:
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。它为我们提供了与原始聚合查询连接的每个分区的范围值,该查询返回每年的最大日期。
要重现我的结果,请按照下面链接中的说明进行操作(这是关于创建分区表的帖子)。这将创建并填充 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
使用max()
函数(示例)。
Select max(y1) y1, max(y2) y2, max(y3) y3
From t