0

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

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
4

3 回答 3

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)

上面的 order by 不是必需的,但会为您提供有序的结果集。

于 2013-10-02T18:44:33.710 回答
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。它为我们提供了与原始聚合查询连接的每个分区的范围值,该查询返回每年的最大日期。

要重现我的结果,请按照下面链接中的说明进行操作(这是关于创建分区表的帖子)。这将创建并填充 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

于 2013-10-03T11:15:56.617 回答
0

使用max()函数(示例)。

Select max(y1) y1, max(y2) y2, max(y3) y3
From t
于 2013-10-02T18:41:15.117 回答