SQL - самый последний по дате - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть таблица потребителей, в которой есть столбцы - Email, AccountState и DateCreated

AccountState может иметь значения 1 (активный), 2 (неактивный) и 3 (в архиве)

Aконкретный потребитель может иметь несколько строк, состоящих из вышеуказанного состояния учетной записи.

Я пытаюсь создать запрос, который возвращает следующее

A.Список записей о потребителях для каждого потребителя (с использованием адреса электронной почты)

B.Только записи, которые не являются самыми последними (поэтому, если на конкретном адресе электронной почты есть 3 записи, по 1 для каждого состояния, будут возвращены 2, которые не являются самыми последними)

Затем, как только у меня будет этоlist Я хочу установить все эти состояния на 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 Ответ

1 голос
/ 08 февраля 2012
;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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...