【问题标题】:SQL - Most recent by dateSQL - 按日期最近
【发布时间】:2012-03-01 00:19:37
【问题描述】:

我有一个消费者表,其中包含以下列 - Email、AccountState 和 DateCreated

AccountState 的值可以是 1(活动)、2(非活动)和 3(已归档)

一个特定的消费者可以有多个由上面的帐户状态组成的行。

我要做的是构造一个返回以下内容的查询

A.每个消费者的消费者记录列表(使用电子邮件地址)

B.只有不是最新的记录(所以如果一个特定的电子邮件地址有 3 条记录,每个州有 1 条,它将返回不是最新的 2 条)

然后,一旦我有了这个列表,我想将所有这些状态设置为 3,因为它们需要被存档。

因此对于此处显示的示例数据

只会返回第 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

【问题讨论】:

    标签: database tsql sql-server-2008-r2


    【解决方案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;
    

    EDIT改变这些行的状态

    ;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;
    

    【讨论】:

    • 他想要所有但最新的,所以我认为应该是 rn > 1。
    • @BalamBalam 你说得对,我是基于 OP 发布的查询(似乎只想找到最新的),而不是单词问题。已更正。
    • 哇,我不太明白这一点,但我会试一试 - 这完全没有给我带来任何回报:S
    • WITH 定义了一个 CTE(公用表表达式)。 CTE 实现了所有行,还允许我们应用窗口函数(如ROW_NUMBER()),这有助于我们在到达外部查询时识别特定行(例如消除每个消费者的最新行)。从您的查询或单词问题中不清楚您是想消除 AccountState &lt;&gt; 1 的所有行还是只删除最旧的行?
    • 不,如果您显示示例数据和所需结果会更有意义。单词问题在小学时很有趣,但在尝试对业务问题进行逆向工程时则不然。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多