Sql server ( 1, 8 ) , ( 1, 14 ) , ( 1, 18 ) , ( 2, 55 ); --显示活动用户 选择u.name, u、 索引地址, us.userId, 美国订阅ID, s、 开始日期, s、 结束日期, s、 斯塔斯 来自#用户u 内部连

Sql server ( 1, 8 ) , ( 1, 14 ) , ( 1, 18 ) , ( 2, 55 ); --显示活动用户 选择u.name, u、 索引地址, us.userId, 美国订阅ID, s、 开始日期, s、 结束日期, s、 斯塔斯 来自#用户u 内部连,sql-server,tsql,Sql Server,Tsql,( 1, 8 ) , ( 1, 14 ) , ( 1, 18 ) , ( 2, 55 ); --显示活动用户 选择u.name, u、 索引地址, us.userId, 美国订阅ID, s、 开始日期, s、 结束日期, s、 斯塔斯 来自#用户u 内部连接#userSubscription-us ON u.id=us.userId s.id=us.subscriptionId上的内部联接#订阅s 其中s.staus=0——活动 --显示非活动用户 选择u.name, u、 索引地址, us.u

( 1, 8 ) , ( 1, 14 ) , ( 1, 18 ) , ( 2, 55 ); --显示活动用户 选择u.name, u、 索引地址, us.userId, 美国订阅ID, s、 开始日期, s、 结束日期, s、 斯塔斯 来自#用户u 内部连接#userSubscription-us ON u.id=us.userId s.id=us.subscriptionId上的内部联接#订阅s 其中s.staus=0——活动 --显示非活动用户 选择u.name, u、 索引地址, us.userId, 美国订阅ID, s、 开始日期, s、 结束日期, s、 斯塔斯 来自#用户u 内部连接#userSubscription-us ON u.id=us.userId s.id=us.subscriptionId上的内部联接#订阅s 其中s.staus=1——不活动 --收拾 删除表#订阅 下拉表#用户 删除表#用户订阅
我可以问一下,SubscriberID链接到什么?那里保存了什么信息?我认为这里需要解决一个设计问题,这将改善情况并减少对更复杂代码的需要。我可以问一下,
SubscriberID
链接到什么,以及那里保存了什么信息吗?我认为这里有一个设计问题需要解决,这将改善情况并减少对更复杂代码的需求。
Subscribers:
==============
ID INT,
Status,
Address,
IndexAddress,
StartDate,
EndDate,
SubscriberID,
PaperID
1   1   MyLocalAddress  13455   20160101    20160501    100     5
8   1   MyLocalAddress  13455   20160820    20161201    100     5
14  1   MyLocalAddress  13455   20161228    20170107    100     5
18  0   MyLocalAddress  NULL    20170109    NULL        100     5
UPDATE s SET
    Status = s2.Status,
    IndexAddress = s2.IndexAddress
FROM dbo.Subscribers s
JOIN dbo.Subscribers s2 ON s2.SubscriberID = s.SubscriberID
WHERE 1 = 1
    AND s.Status <> s2.Status
    AND s2.Status = 1
    AND s2.ID IN
    (
        SELECT
            MAX(s3.ID)
        FROM dbo.Subscribers s3
        WHERE 1 = 1
            AND s3.SubscriberID = s.SubscriberID
            AND s3.PaperID = s.PaperID
            AND s3.Status = 1
            AND s3.ID <> s.ID
    )
    -- Make sure it's the same customer. Customer number is checked in
    -- join above.
    AND s.PaperID = s2.PaperID
    AND s.Address = s2.Address
with toupdate as (
      select s.*,
             lag(address) over (partition by subscriberid, paperid order by id) as prev_address,
             lag(status) over (partition by subscriberid, paperid order by id) as prev_status
      from dbo.Subscribers s
     ) 
update toupdate
    set address = prev_address,
        status = prev_status
    where address is null;
-- user level information with 1 row per user - address should be linked here
CREATE TABLE #user
    (
      id INT ,
      name NVARCHAR(20) ,
      indexAddress INT
    )

-- all subscriptions - with calculated status compared to current date
CREATE TABLE #subscription
    (
      id INT ,
      startDate DATETIME ,
      endDate DATETIME ,
      staus AS CASE WHEN endDate < GETDATE() THEN 1
                    ELSE 0
               END
    )

-- table to link users with their subscriptions
CREATE TABLE #userSubscription
    (
      userId INT ,
      subscriptionId INT
    )


INSERT  INTO #user
        ( id, name, indexAddress )
VALUES  ( 1, N'bob', 13455 ),
        ( 2, 'dave', 55332 )

INSERT  INTO #subscription
        ( id, startDate, endDate )
VALUES  ( 1, '20160101', '20160201' ),
        ( 8, '20160820', '20161201' ),
        ( 14, '20161228', '20170107' ),
        ( 18, '20170109', NULL ),
        ( 55, '20170101', NULL );   

INSERT  INTO #userSubscription
        ( userId, subscriptionId )
VALUES  ( 1, 1 ) ,
        ( 1, 8 ) ,
        ( 1, 14 ) ,
        ( 1, 18 ) ,
        ( 2, 55 );

-- show active users
SELECT u.name ,
       u.indexAddress ,
       us.userId ,
       us.subscriptionId ,
       s.startDate ,
       s.endDate ,
       s.staus 
FROM  #user u
INNER JOIN #userSubscription us ON u.id = us.userId
INNER JOIN #subscription s ON s.id = us.subscriptionId
WHERE s.staus = 0 -- active

-- show inactive users
SELECT u.name ,
       u.indexAddress ,
       us.userId ,
       us.subscriptionId ,
       s.startDate ,
       s.endDate ,
       s.staus 
FROM  #user u
INNER JOIN #userSubscription us ON u.id = us.userId
INNER JOIN #subscription s ON s.id = us.subscriptionId
WHERE s.staus = 1 -- inactive

-- tidy up
DROP TABLE #subscription
DROP TABLE #user
DROP TABLE #userSubscription