我正在尝试按 年 和 月
对表进行分区。我将通过其划分分区的列是具有ISO格式(‘20150110’,20150202’等)的日期时间类型列。
例如,我有2010年,2011年和2012年的销售数据。我希望数据按年份进行分区,并且每年也按月份进行分区。(2010/01,2010/02,…
2010/12,2011/01,… 2015/01 …)
前任:
Sales2010Jan,Sales2010Feb,Sales2011Jan,Sales2011Feb,Sales2012Dec等
我的问题是:有可能吗?如果是,我如何使用SSIS自动执行该过程?
SSIS是一个ETL(提取,转换,加载)。这不是您想要做的。您只需要动态创建DDL语句。
我在以下季度工作,但如果需要,它也可以在1、2或X个月使用。
如果要对表进行分区,则首先需要创建文件,文件组和分区表并手动设置分区
在具有int标识PK和datetime2分区列的表上为2015 Q1(在Q1之前和Q2之后)创建N +
1分区。更新它以增加月份,使其每月或任何您需要的…
首先创建N个文件组:
Alter Database [Test] Add Filegroup [Part_Before2015]
Go
Alter Database Test Add Filegroup [Part_201501]
Go
Alter Database Test Add Filegroup [Part_201504]
Go
为每个文件组添加一个文件:
Alter Database [Test] Add FILE ( NAME = N'Part_Before2015', FILENAME = N'...\Part_Before2015.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_Before2015]
Alter Database [Test] Add FILE ( NAME = N’Part_201501’, FILENAME = N’…\Part_201501.ndf’ , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_201501]
Alter Database [Test] Add FILE ( NAME = N’Part_201504’, FILENAME = N’…\Part_201504.ndf’ , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_201504]
在datetime2类型(或日期或什至日期时间)上创建分区函数:
Create Partition Function RangePartFunction (datetime2)
as Range Right For Values (‘20150101’, ‘20150401’)
在每个文件组(N + 1)上使用分区功能创建一个分区方案:
Create Partition Scheme RangePartScheme as Partition RangePartFunction
To ([Part_Before2015], [Part_201501], [Part_201504])
根据其分区方案创建分区表:
Create TABLE [PartitionTable] (id int identity(0, 1) not null, date datetime2 not null, text char(8000))
On RangePartScheme (date) ;
在分区列和分区方案上添加聚簇索引:
Create Clustered Index IDX_Part On dbo.PartitionTable(date)
On RangePartScheme (date);
将PK添加到id列:
Alter Table dbo.PartitionTable Add COntraint PK_Part Primary Key Nonclustered(id, date);
构建用于在右边界后添加额外文件组的查询,并拆分最后一个分区
复习所有这些内容以及如何使用它来创建动态SQL
Declare @currentDate datetime2
Declare @endDate datetime2 = ‘20160701’ – new end date
Declare @dateAdd int = 3 – Add 3 month = 1 Quarter
– Get Current boundaries
Select @currentDate = DATEADD(MONTH, @dateAdd,Cast(MAX(value) as datetime2)) From sys.partition_range_values as r
Inner Join sys.partition_functions as f on r.function_id = f.function_id
Where f.name = ‘RangePartFunction’
– Get all quarters between max and end date
; with d(id, date, name) as (
Select 0, @currentDate, Convert(char(6), @currentDate, 112)
Union All
Select id+1, DATEADD(MONTH, @dateAdd, date), Convert(char(6), DATEADD(MONTH, @dateAdd, date), 112)
From d Where d.date <= @endDate
)
Select * From (
Select id = id10, query = ‘If Not Exists(Select 1 From sys.filegroups Where name = ‘’Part_’+name+’‘’)
Begin
Print ‘’Create Filegroup [Part_’+name+’]’‘
Alter Database [Test] Add Filegroup [Part_’+name+’]
End
GO’
From d
Union All
Select id10+1, ‘If Not Exists(Select 1 From sys.sysfiles Where name = ‘’Part_’+name+’‘’)
Begin
Print ‘’Create File [Part_’+name+’.ndf]’‘
Alter Database [Test] Add FILE ( NAME = N’‘Part_’+name+’‘’, FILENAME = N’‘C:\DB\MSSQL11.MSSQLSERVER\MSSQL\DATA\Part_’+name+’.ndf’‘ , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_’+name+’]
End
GO’
From d
Union All
Select id10+2, ‘Print ‘’Add Range [Part_’+name+’]’‘
Alter Partition Scheme RangePartScheme Next Used [Part_’+name+’]
Go’
From d
Union All
Select id10+3, ‘Print ‘’Split Function [‘+Convert(char(8), date, 112)+’]’‘
Alter Partition Function RangePartFunction() Split Range (‘’‘+Convert(char(8), date, 112)+’‘’);
Go’
From d
) as q order by id
该查询的输出是必须按顺序运行的SQL查询的列表。
执行动态SQL
自动化
如果要每月运行一次并确保始终创建接下来的12个月,请使用此命令 Set @endDate = DATEADD(MONTH, 12, getdate())
最后
它将为函数的最后一个边界和@endDate之间的N个丢失的四分之一输出4 * N行:
它也可以通过工作自动化,即。@endDate = DATEADD(MONTH, 3, getdate()
将在接下来的3个月内创建
关联
创建作业= https://www.mssqltips.com/sqlservertip/3052/simple-way-to-create-a-sql-
server-job-using-tsql/
sp_executesql = https://technet.microsoft.com/zh-
cn/library/ms188001%28v=sql.110%29.aspx
While循环= https://dba.stackexchange.com/questions/57933/can-exec-work-with-
while-loop-of-cursor
问题内容: 给定一个在每行上都带有时间戳的表,您将如何格式化查询以适合此特定的json对象格式。 我正在尝试将json对象组织成年/月。 json以查询为基础: 这是我到目前为止的查询- 该查询正在分解,因为它(可预测地)将不同年份组合在一起。 问题答案: 是你想要的。
问题内容: 我在Postgres服务器上有以下数据库表: 我想创建一个查询,给出了的按月份和年份如下列并对结果进行分组: 有没有简单的方法可以做到这一点? 问题答案: 应Radu的要求,我将解释该查询: :将“日期”属性转换为月的简短形式的定义格式。 :Postgresql的“提取”功能用于从“日期”属性中提取YYYY年。 :SUM()函数将所有“ Sales”值相加,并提供区分大小写的别名,并使
我有以下数据框: 我需要按年和月分组数据。即:按2013年1月、2013年2月、2013年3月等分组...我将使用新分组的数据来创建一个显示每年/每月abc vs xyz的图表。 我尝试过groupby和sum的各种组合,但似乎没有任何效果。 谢谢你的帮助。
问题内容: 我想要 但是这个查询不能使用 如何使用SQLAlchemy做到这一点? 问题答案: 假设您的数据库引擎实际上支持诸如之类的功能,则可以尝试 否则你可以像
问题内容: 我有一个像这样的简单模型: 我想输出按月细分: 一个月内有多少笔交易() 合并值() 我不确定最好的攻击方法是什么。我已经看到了一些看上去很吓人的额外选择查询,但我的简单想法是告诉我,最好是迭代数字,从任意开始的年/月开始,一直计数到我达到当月,然后简单地抛出查询该月的过滤条件。更多数据库工作-减轻开发人员压力! 什么对你最有意义?有什么好方法可以拉回快速数据表吗?还是我的肮脏方法可能
问题内容: 我有一个具有此架构的表 我正在尝试使查询工作显示每个月的总数。到目前为止,我已经尝试过DateDiff和嵌套选择,但都没有给我想要的东西。我认为这是最接近的: 但是当我应该获取值时,我只会得到空值。我想念什么吗? 问题答案: 您也可以尝试: