【问题标题】:Get newest record per group from subquery从子查询中获取每组的最新记录
【发布时间】:2020-06-07 22:05:38
【问题描述】:

我想从我的查询中获取基于date 的每个email 的最新记录。

此查询为每封电子邮件生成多条记录。我们将此输出称为表C

我的问题是:如何从别名表C 中仅过滤最近的记录。

+-------------------+-----+------------+
| email             | id  | date       |
+-------------------+-----+------------+
| hello@example.com | 123 | 2020-06-21 |
+-------------------+-----+------------+
| hello@example.com | 123 | 2020-06-15 |
+-------------------+-----+------------+

想要的结果是:

+-------------------+-----+------------+
| email             | id  | date       |
+-------------------+-----+------------+
| hello@example.com | 123 | 2020-06-21 |
+-------------------+-----+------------+

我的起始查询(产生多条电子邮件记录)如下:

SELECT DISTINCT
    Email,
    ID,
    Date
FROM [TABLE_A] AS a    
LEFT JOIN (
    select *
    from [TABLE_B]
    where ID = '123'
) AS b
ON a.Email = b.Key

我的尝试:

SELECT c.Email, c.ID, c.Date
FROM (
    SELECT DISTINCT
        Email,
        ID,
        Date
    FROM [TABLE_A] AS a   
    LEFT JOIN (
        select *
        from [TABLE_B]
        where ID = '123'
    ) AS b ON a.Email = b.Key   
) AS c    
INNER JOIN (
    SELECT Email, max(Date) as MaxDate
    FROM c
    GROUP BY Email
) tm on c.Email = tm.Email and c.Date = tm.Date

看起来 SQL 无法“看到”表 C,因为我收到错误:

无效的对象名称

【问题讨论】:

  • ID 是否保持不变,如您的示例数据所示?还是实际上应该根据每条记录更改?
  • 它将保持不变
  • 那么你想要的只是SELECT Email, ID, max(Date) FROM [TABLE_A] group by Email, ID
  • 啊,不。我的初始查询是我需要最新 (email) 记录的查询。所以从那个查询中,我想过滤/选择基于date的最新记录
  • 那么请用足够的样本数据和预期结果更新您的问题以解释您的意思,因为我显示的查询给出了您的要求。

标签: sql-server sql-server-2008 subquery


【解决方案1】:

您可以将WITH TIESrow_number() 配合使用

示例

Select Top 1 with ties *
 From  YourTable
 Order By Row_Number() over (Partition By Id Order By [Date] Desc)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 2021-10-17
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多