我的任务是清理组织支持者的数据。虽然我对一些SQL查询编码没问题,但我遇到了一些问题,有点复杂(对我来说很好!)。
任务是将支持者标记为活动或已失效。
我可以通过查看他们的开始日期来做到这一点,如果距离那个日期不到两年,我们可以将其标记为活动状态,将任何内容标记为已关闭。遗憾的是,根据他们与组织的互动方式,没有什么比这更容易了,支持者可能会爬上更高的水平。
我需要查询的目的是查看他们是否有其他支持者代码。例如,它们不能在两个级别上处于活动状态,我需要查询以查看它们是否处于下一级别,如果是这样,则无论它们是否符合上述规则,都会失去先前的代码。他们可以上升到5个级别。
我希望这是有道理的。数据看起来像这样。
Member ID | Category | Start Date | End Date
123456 | LEG1 | 01/12/2012 |
654321 | LEG1 | 01/01/2009 |
421124 | LEG1 | 01/05/2011 |
421124 | LEG2 | 02/04/2011 | 31/12/2012
421124 | LEG3 | 02/04/2011 | 31/12/2012
421124 | LEG4 | 31/12/2012 |
567888 | LEG2 | 14/03/2012 |
567888 | LEG3 | 22/08/2012 |
119119 | LEG2 | 01/01/2011 | 31/12/2012
感谢任何建议。
答案 0 :(得分:0)
试试这样:
DECLARE @t TABLE([Member ID] INT, Category VARCHAR(100), [Start Date] DATE, [End Date] DATE)
INSERT @t
SELECT a,b,CONVERT(DATE, c, 104) c, CONVERT(DATE, d, 104)
FROM (VALUES
(123456 ,'LEG1', '01/12/2012', NULL),
(654321 ,'LEG1', '01/01/2009', NULL),
(421124 ,'LEG1', '01/05/2011', NULL),
(421124 ,'LEG2', '02/04/2011', '31/12/2012'),
(421124 ,'LEG3', '02/04/2011', '31/12/2012'),
(421124 ,'LEG4', '31/12/2012', NULL),
(567888 ,'LEG2', '14/03/2012', NULL),
(567888 ,'LEG3', '22/08/2012', NULL),
(119119 ,'LEG2', '01/01/2011', '31/12/2012')
-- I added these rows to sample data to show how borderline cases are treated
(100000 ,'LEG1', '17/02/2011', NULL),
(100001 ,'LEG1', '18/02/2011', NULL),
(100002 ,'LEG1', '19/02/2011', NULL)
) tbl(a,b,c,d)
SELECT *
, CASE WHEN
ROW_NUMBER() OVER (PARTITION BY [Member ID] ORDER BY Category DESC) > 1
OR
[Start Date] < DATEADD(YEAR, -2, CAST(GETDATE() AS DATE))
THEN 'lapsed'
ELSE 'active'
END [Status]
FROM @t
ORDER BY
[Member ID]
它会检查您的两个条件,ROW_NUMBER()
功能可确保未达到最高类别的行无法标记为有效,并且DATETIME
与今天的日期减去2 [Start Date]
进行比较年来照顾你的第二个条件。如果满足任何这些条件,记录将不会被标记为活动。