求个方案,合适的话可以请你代工

teleinfor 2012-06-01 11:11:49
目标数据库,需要定时的执行任务。每个小时执行一次,对前一个小时的数据进行整理,整理结果存入新的表。
应该是用job实现了。

业务逻辑:
1、知道目标数据库
2、知道目标表
3、定时执行任务整理数据
4、按照天、周、月、年整理数据
5、数据存入新的表供查

请各位出个方案,有能力有空合作者,可以请代工。谢谢。呵呵。
...全文
191 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitao 2012-06-04
  • 打赏
  • 举报
回复
方案就是你说的了
问题就是具体实现的sql了
  • 打赏
  • 举报
回复


--基础数据表:
IF OBJECT_ID('[WSO_GN_PDP_CONTEXT_CREATE]','P')IS NOT

NULL
DROP TABLE [WSO_GN_PDP_CONTEXT_CREATE]
GO
CREATE TABLE [WSO_GN_PDP_CONTEXT_CREATE](

[SessionID] [bigint] NULL,
[ProbeID] [smallint] NULL,
[State] [smallint] NULL,
[Attempt] [int] NULL,
[IMSI] [bigint] NULL,
[MSISDN] [bigint] NULL,
[IMEI] [bigint] NULL,
[IMEI_TAC] [int] NULL,
[IMEI_SNR] [int] NULL,
[Current_LAC] [int] NULL,
[Current_CELL] [int] NULL,
[timeBegin] [bigint] NULL,
[timeACC] [int] NULL,
[APN] [varchar](32) NULL,
[UserIP] [int] NULL,
[NSAPI] [smallint] NULL,
[RATType] [smallint] NULL,
[ChargingId] [int] NULL,
[ChargeGateWay] [int] NULL,
[SGSN_CONTROL] [int] NULL,
[SGSN_DATA] [int] NULL,
[GGSN_CONTROL] [int] NULL,
[GGSN_DATA] [int] NULL,
[Cause] [smallint] NULL

)
GO
--保存整理数据表结构:
IF OBJECT_ID

('[WSO_GN_PDP_CONTEXT_CREATE_STATS_TYPE1]','P')IS NOT

NULL
DROP TABLE [WSO_GN_PDP_CONTEXT_CREATE_STATS_TYPE1]
GO
CREATE TABLE [WSO_GN_PDP_CONTEXT_CREATE_STATS_TYPE1](

[timeBegin] [bigint] NULL,
[ProbeID] [smallint] NULL,
[RATType] [smallint] NULL,
[SGSN_CONTROL] [int] NULL,
[CURRENT_LAC] [int] NULL,
[CURRENT_CELL] [int] NULL,
[UserCount] [bigint] NULL,
[TOTAL_HITS] [bigint] NULL,
[PDP_ACT_SUCC] [bigint] NULL,
[PDP_ACT_FAIL] [bigint] NULL,
[PDP_ACT_TO] [bigint] NULL,
[PDP_ACT_DELAY_AVG] [int] NULL,
[PDP_ACT_DELAY_MIN] [int] NULL,
[PDP_ACT_DELAY_MAX] [int] NULL

)


declare @date1 datetime
set @date1=GETDATE()
SELECT
(timeBegin/1000/300)*300*1000 AS timeBegin,
ProbeID,
RATType,
SGSN_CONTROL,
CURRENT_LAC,
CURRENT_CELL,
COUNT_BIG(DISTINCT IMSI) AS UserCount,
COUNT_BIG(*) AS TOTAL_HITS,
SUM(cast(case when [State]=1 then 1 else 0 end as

bigint)) AS PDP_ACT_SUCC,
SUM(cast(case when [State]=2 or [State]=3 then 1

else 0 end AS bigint)) AS PDP_ACT_FAIL,
SUM(cast(case when [State]=3 then 1 else 0 end as

bigint)) AS PDP_ACT_TO,
AVG(case when [State]=1 then timeACC else NULL end)

AS PDP_ACT_DELAY_AVG,
MIN(case when [State]=1 then timeACC else NULL end)

AS PDP_ACT_DELAY_MIN,
MAX(case when [State]=1 then timeACC else NULL end)

AS PDP_ACT_DELAY_MAX
--into WSO_GN_PDP_CONTEXT_CREATE_STATS_TYPE1
FROM
WSO_GN_PDP_CONTEXT_CREATE
GROUP BY
(timeBegin/1000/300)*300*1000,
ProbeID,
RATType,
SGSN_CONTROL,
CURRENT_LAC,
CURRENT_CELL
declare @date2 datetime
set @date2=GETDATE()
print DATEDIFF(MS,@date1,@date2)
--创建索引:
CREATE CLUSTERED INDEX WSO_GN_PDP_CONTEXT_IDX
ON [WSO_GN_PDP_CONTEXT_CREATE]

(timeBegin,ProbeID,RATType,
SGSN_CONTROL,CURRENT_LAC,CURRENT_CELL)



DROP INDEX WSO_GN_PDP_CONTEXT_IDX ON

[WSO_GN_PDP_CONTEXT_CREATE]
--JOB每小时执行一次,对上一个小时的数据整理,把整理的结果

存入TYPE1表。
--每天目标数据的名称为:WSO20120602,就是WSO + 日期。
--举个例子,2点执行的时候把00:00 ~ 01:59:59秒发生的记录,

整理后存入当前数据库的TYPE1表。
--1点执行的那个比较特殊,这个时候执行的是昨天的23:00:00 ~

23:59:59时间范围的数据。

USE master
GO
IF OBJECT_ID('Pro_test')IS NOT NULL
DROP PROC Pro_test
GO
CREATE PROC Pro_test
AS
--定义变量@DBName,实现对数据库名字的动态
DECLARE @DBName VARCHAR(15)
SET @DBName='[WSO'+CONVERT(VARCHAR(8),GETDATE

(),112)+']'
--定义变量@TBName
DECLARE @TBName VARCHAR(50)
--给变量@TBName赋值,并且实现00:00:00的跨库功能
SET @TBName=
CASE WHEN DATEPART(HH,GETDATE())<>0 THEN

'WSO_GN_PDP_CONTEXT_CREATE'
ELSE '[WSO'+CONVERT(VARCHAR(8),DATEADD(DD,-

1,GETDATE()),112)+']..'+'WSO_GN_PDP_CONTEXT_CREATE' END
--PRINT @TBName
--定义变量,用来存储拼接的SQL语句:
DECLARE @SQL VARCHAR(MAX)
SET @SQL='
USE '+@DBName
+'
GO
IF OBJECT_ID(''WSO_GN_PDP_CONTEXT_CREATE_STATS_TYPE1'')

IS NULL
GO
CREATE TABLE WSO_GN_PDP_CONTEXT_CREATE_STATS_TYPE1(

[timeBegin] [bigint] NULL,
[ProbeID] [smallint] NULL,
[RATType] [smallint] NULL,
[SGSN_CONTROL] [int] NULL,
[CURRENT_LAC] [int] NULL,
[CURRENT_CELL] [int] NULL,
[UserCount] [bigint] NULL,
[TOTAL_HITS] [bigint] NULL,
[PDP_ACT_SUCC] [bigint] NULL,
[PDP_ACT_FAIL] [bigint] NULL,
[PDP_ACT_TO] [bigint] NULL,
[PDP_ACT_DELAY_AVG] [int] NULL,
[PDP_ACT_DELAY_MIN] [int] NULL,
[PDP_ACT_DELAY_MAX] [int] NULL

)
GO
SELECT
(timeBegin/1000/300)*300*1000 AS timeBegin,
ProbeID,
RATType,
SGSN_CONTROL,
CURRENT_LAC,
CURRENT_CELL,
COUNT_BIG(DISTINCT IMSI) AS UserCount,
COUNT_BIG(*) AS TOTAL_HITS,
SUM(cast(case when [State]=1 then 1 else 0 end as

bigint)) AS PDP_ACT_SUCC,
SUM(cast(case when [State]=2 or [State]=3 then 1

else 0 end AS bigint)) AS PDP_ACT_FAIL,
SUM(cast(case when [State]=3 then 1 else 0 end as

bigint)) AS PDP_ACT_TO,
AVG(case when [State]=1 then timeACC else NULL end)

AS PDP_ACT_DELAY_AVG,
MIN(case when [State]=1 then timeACC else NULL end)

AS PDP_ACT_DELAY_MIN,
MAX(case when [State]=1 then timeACC else NULL end)

AS PDP_ACT_DELAY_MAX
FROM
'
+
@TBName
+
'
GROUP BY
(timeBegin/1000/300)*300*1000,
ProbeID,
RATType,
SGSN_CONTROL,
CURRENT_LAC,
CURRENT_CELL
GO'
PRINT @SQL
Lyongt 2012-06-03
  • 打赏
  • 举报
回复
“数据库是每天一个的”,那就是动态目标表,根据目标表的命名规则动态定位到当天的目标表上,如楼上所说,动态语句指定到相应的目标表上,其他操作都好办了
Rotel-刘志东 2012-06-02
  • 打赏
  • 举报
回复
作业处理了。如果对于数据表的连接查询比较大的话。最好还是插入到临时表处理。
  • 打赏
  • 举报
回复
这个肯定得涉及到作业问题。
现在有个疑问:
1、知道目标数据库
2、知道目标表
你的这两部是什么意思?

是不知道目标数据库和目标表的情况下执行你的操作还是知道的情况下?知道的话就比较简单了
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

不好意思,可能我没讲清楚。就是说在这个事情里面,以下这几个条件都是知道的。
1、知道目标数据库
2、知道目标表
我这个数据库是每天一个的。所以这个job的执行,首先要定位到目标数据库,然后定位到目标表,然后执行需要的操作。当然,如何确定数据库和表的规则都是明确的。

当然,job不止一个,是项目当中的一个环节,处理的任务还是蛮多的。所以想找个伙伴一起合作来做。

请各位达达指导,如……
[/Quote]

这种情况也就是说目标数据库是动态的,需要写动态语句。

动态的语句主要就是通过笃定字符串跟插进来的参数进行拼接,然后在执行。

如果不明白的话加你你给出具体例子
teleinfor 2012-06-02
  • 打赏
  • 举报
回复
不好意思,可能我没讲清楚。就是说在这个事情里面,以下这几个条件都是知道的。
1、知道目标数据库
2、知道目标表
我这个数据库是每天一个的。所以这个job的执行,首先要定位到目标数据库,然后定位到目标表,然后执行需要的操作。当然,如何确定数据库和表的规则都是明确的。

当然,job不止一个,是项目当中的一个环节,处理的任务还是蛮多的。所以想找个伙伴一起合作来做。

请各位达达指导,如果合适的话,可以代工给我做,谢谢哦。

[Quote=引用 2 楼 的回复:]
这个肯定得涉及到作业问题。
现在有个疑问:
1、知道目标数据库
2、知道目标表
你的这两部是什么意思?

是不知道目标数据库和目标表的情况下执行你的操作还是知道的情况下?知道的话就比较简单了
[/Quote]

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧