sql-server - 如何使用每周计划状态表创建显示计划开始和结束日期的表格
问题描述
有人可以在 SQL Server 中使用 T-SQL 帮助我解决以下问题吗?
我的原始表格显示了一家公司的计划每周状态:该计划是在市场上还是在市场上。表结构如下:
ProgramID Status Sunday
1 1 1/3/2016
1 1 1/10/2016
1 0 1/17/2016
1 1 1/24/2016
2 0 1/3/2016
2 1 1/10/2016
2 1 1/17/2016
2 0 1/24/2016
我想创建一个如下表。当 ProgramID 1 投放市场时,我使用第 1 行完成记录(Program ID = 1, StartSunday = 1/3/2016, EndSaturday = NULL
)。然后,程序 1 于 2016 年 1 月 17 日下架。所以,我在第一行填写了 EndSaturday 值“2016 年 1 月 16 日”。当 ProgramID 2 不在市场上时,我不会开始记录它(注意我有 ProgramID = 2 Status = 0 Sunday = 1/3/2016)。当 ProgramID 2 于 2016 年 1 月 10 日首次投放市场时,我开始记录我们为 ProgramID 1 所做的记录(ProgramID = 1,StartSunday = 1/10/2016,EndSaturday = Null)。当程序于 2016 年 1 月 24 日上市时,我更新了第 3 行的记录,ProgramID = 2,StartSunday = 1/10/2016,EndSaturday = 1/23/2016。
ProgramID StartSunday EndSaturday
1 1/3/2016 1/16/2016
1 1/24/2016 NULL
2 1/10/2016 1/23/2016
这个问题和帖子一样:Manipulate Login Logout data with T-SQL in SQL Server
但是,我的数据还有一行:(1,CONVERT(datetime2(7),'9/1/13 15:00', 1), 1),这意味着某些程序一开始不在系统中。然后,代码不再起作用。
如果存在则删除表 T;
创建表 T(UserID int, EventTime datetime2(7), [Event] bit)
去
插入 T(用户 ID、事件时间、事件)
价值观
(1,CONVERT(datetime2(7),'9/1/13 15:00', 1), 1),
(1,CONVERT(datetime2(7),'9/1/13 15:33', 1), 0),
(1,CONVERT(datetime2(7),'9/1/13 17:00', 1), 0),
(1,CONVERT(datetime2(7),'9/1/13 18:00', 1), 0),
(1,CONVERT(datetime2(7),'9/1/13 18:20', 1), 1),
(1,CONVERT(datetime2(7),'9/1/13 18:30', 1), 1),
(1,CONVERT(datetime2(7),'9/2/13 11:05', 1), 0),
(1,CONVERT(datetime2(7),'9/2/13 11:45', 1), 1),
(1,CONVERT(datetime2(7),'9/2/13 13:50', 1), 0),
(2,CONVERT(datetime2(7),'9/1/13 16:15', 1), 0),
(2,CONVERT(datetime2(7),'9/1/13 17:00', 1), 1),
(2,CONVERT(datetime2(7),'9/1/13 18:01', 1), 0),
(2,CONVERT(datetime2(7),'9/1/13 18:02', 1), 0),
(2,CONVERT(datetime2(7),'9/1/13 19:02', 1), 1),
(3,CONVERT(datetime2(7),'9/1/13 15:10', 1), 1),
(3,CONVERT(datetime2(7),'9/1/13 17:10', 1), 0),
(3,CONVERT(datetime2(7),'9/1/13 19:10', 1), 1),
(3,CONVERT(datetime2(7),'9/2/13 21:01', 1), 0)
去
从 T 中选择 *
按用户 ID、事件时间、事件排序
去
解决方案
创建表的代码:
CREATE TABLE MarketRecord (
ProductID VARCHAR(10) NOT NULL,
Status BIT DEFAULT(0),
StartDate DATE NOT NULL
EndDate DATE NOT NULL
)
您将更新您的表格并更改产品的状态:
UPDATE MarketRecord
SET Status = 1
WHERE PtoductID = <some item>
然后,您将使用对状态更改做出反应的 FOR UPDATE TRIGGER:
CREATE TRIGGER trgChangeStatus
ON MarketRecord
AFTER UPDATE
AS
BEGIN
UPDATE MarketRecord
SET EndDate = GETDATE()
FROM MarketRecord
INNER JOIN inserted i
ON ProductID = i.ProductID
END
推荐阅读
- java - 如何从 gradle 任务运行 mvn 命令?
- python - 如何在矩阵中找到未知变量,python中的A = B?
- batch-file - 批处理 goto 一直给我相同的输出?
- python - Tkinter 中的非阻塞线程和“停止线程”按钮
- c++ - 在另一个向量中的某个位置插入一个向量
- machine-learning - 使用 K-means 聚类文本数据中的聚类 ID 作为监督学习模型的特征是不是一个坏主意?
- php - 带有 MySQL 数据的 PHP 数组
- reactjs - 获取后严格依赖于状态形状的 React 组件的 mapStateToProps
- html - 如何开始伪元素的动画比css中的父元素开始有点晚?
- azure - Azure Container Instance not using public IP