2012-02-08 54 views
0

最近我有有列的消費者表 - 電子郵件,AccountState和dateCreated會SQL - 按日期

AccountState的值可以是1(有效),2(未激活)和3(存檔)

特定的消費者可以擁有多個由上述帳戶狀態組成的行。

我所試圖做的是建立一個查詢返回以下

A的消費記錄清單爲每個消費者(使用電子郵件地址)

B.只有那些沒有記錄最近(所以如果一個特定的電子郵件地址有3個記錄,每個狀態1,它將返回2不是最新的)

然後,一旦我有這個列表,我想設置所有這些狀態3,因爲他們需要歸檔。

所以對於示例數據如下所示

enter image description here

只有行13 - 16將返回。

我試圖使用下面的查詢來做到這一點,但它不工作。

SELECT     con.Email, 
         con.Id, 
         con.DateCreated     AS DateRegistered, 
         con.DateLastActivity, 
         con.hasiPhone, 
         con.hasAndroid, 
         con.hasSMS, 
         con.CurrencyCode    AS Currency, 
         con.AccountState 


     FROM   Consumer      con 

     WHERE   con.AccountState    <> 1 
     AND    DateCreated  =( SELECT MAX(DateCreated) 
          FROM Consumer      con_most_recent 
          WHERE con_most_recent.AccountState <> 1 
          AND  con_most_recent.Id    = con.Id) 

     order by Email asc 
+1

定義「不工作」 – JNK 2012-02-08 14:44:52

回答

1
;WITH x AS 
(
    SELECT rn = ROW_NUMBER() OVER (PARTITION BY EMail ORDER BY DateCreated DESC), 
    Email, Id, DateCreated AS DateRegistered --, ... other columns 
    FROM dbo.Consumer 
    WHERE AccountState <> 1 
) 
SELECT Email, Id, DateRegistered --, ... other columns 
FROM x 
WHERE rn > 1 
ORDER BY Email; 

編輯改變狀態的這些行

;WITH x AS 
(
    SELECT rn = ROW_NUMBER() OVER (PARTITION BY EMail ORDER BY DateCreated DESC), 
    Email, Id, DateCreated AS DateRegistered --, ... other columns 
    FROM dbo.Consumer 
    WHERE AccountState <> 1 
) 
UPDATE x 
SET AccountState = 3 
WHERE rn > 1; 
+1

他希望所有,但最近的,所以我覺得應該是Rn> 1 – Paparazzi 2012-02-08 14:53:04

+0

@BalamBalam你是對的,我基於OP發佈的查詢(它似乎只想找到最新的),而不是單詞問題。糾正。 – 2012-02-08 14:56:12

+0

哇,我真的不明白這一點,但我會放棄它 - 這絕對沒有回報我:S – swade1987 2012-02-08 14:59:02