有人可以在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日退出市场。因此,我将值'1/16/2016'填充到第一行的EndSaturday。当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更新了记录,StartID为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]位)
GO
插入T(UserID,EventTime,Event)
值
(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)
GO
选择*来自T
按用户ID,事件时间,事件排序
GO
答案 0 :(得分:0)
用于创建表的代码:
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
答案 1 :(得分:0)
这可以作为查询或视图来完成:
gp_list_t = [int(i) for i in gp_list]
agencys_sp = GPSpecial.objects.filter(agencys=user_agency,is_active=True,id__in=gp_list_t).values_list('agencys')
for value, in agencys_sp:
print(value)