如何使用每周节目状态表创建显示节目开始和结束日期的表

时间:2018-08-06 23:54:06

标签: sql-server tsql

有人可以在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

2 个答案:

答案 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)