Sql server ( 1, 8 ) , ( 1, 14 ) , ( 1, 18 ) , ( 2, 55 ); --显示活动用户 选择u.name, u、 索引地址, us.userId, 美国订阅ID, s、 开始日期, s、 结束日期, s、 斯塔斯 来自#用户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——不活动 --收拾 删除表#订阅 下拉表#用户 删除表#用户订阅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
我可以问一下,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