-2

我的任务是清理组织支持者的数据。虽然我对一些 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

感激地收到任何建议。

4

1 回答 1

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()函数确保不能将未达到最高类别的行标记为活动,并且与今天的日期减去 2 年DATETIME之间的比较处理您的第二个条件。[Start Date]如果满足这些条件中的任何一个,记录将不会被标记为活动。

于 2013-02-18T11:07:21.677 回答