SQL查询 - 确定支持者状态

时间:2013-02-18 10:47:48

标签: sql sql-server-2008

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

感谢任何建议。

1 个答案:

答案 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]进行比较年来照顾你的第二个条件。如果满足任何这些条件,记录将不会被标记为活动。

相关问题