【问题标题】:Select Must Return only one row against every id选择必须针对每个 id 只返回一行
【发布时间】:2021-11-25 02:00:54
【问题描述】:

我正在使用以下查询来获取结果。查询的目的是获取每个客户的最新sales_amount,但是当给定日期范围内的销售额为两个或更多时,查询返回所有记录,我如何才能仅获取针对id的最新记录。同一个 id 每个 id 应该只包含一行。

SELECT id,
       Max(date),
       sales_amount
FROM   customer
WHERE  date BETWEEN '2020-08-01' AND '2020-08-15'
       AND id = 1001
GROUP  BY id,
          sales_amount; 

【问题讨论】:

  • 您需要使用窗口功能 -- 您使用的是什么平台?

标签: sql select


【解决方案1】:

您可以在子查询中使用行号给您排序,然后只选择第一个。

SELECT *
FROM (
  SELECT id, date, sales_amount,
         ROW_NUMBER() OVER (ORDER BY date DESC) as RN
  FROM   customer
  WHERE  date BETWEEN '2020-08-01' AND '2020-08-15'
       AND id = 1001
) sub
WHERE RN = 1

请注意,如果您想为所有客户执行此操作,那么这就是查询

SELECT *
FROM (
  SELECT id, date, sales_amount,
         ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) as RN
  FROM   customer
  WHERE  date BETWEEN '2020-08-01' AND '2020-08-15'
) sub
WHERE RN = 1

这将为您提供每个客户的最新行。

【讨论】:

    【解决方案2】:

    这是因为你在 group by 子句中包含了 ID,所有的 ID 都会被返回。

    【讨论】:

    • Group by 用于对所有重复项进行分组。
    • 是的 - 但每一行都可能有一个唯一的 ID,这意味着您已按标识符分组
    【解决方案3】:

    您是否尝试过添加:

       SELECT id,
       Max(date),
       sales_amount
       FROM   customer
       WHERE  date BETWEEN '2020-08-01' AND '2020-08-15'
       AND id = 1001
       GROUP  BY id,
          sales_amount
       ORDER BY date DESC 
       LIMIT 1;
    

    【讨论】:

    • 这仍然有 group by 所以它会有同样的问题
    【解决方案4】:
    select * from (
    
        SELECT  ROW_NUMBER() as Rn, 
           id,
           Max(date),
           sales_amount
    FROM   customer
    WHERE  date BETWEEN '2020-08-01' AND '2020-08-15'
           AND id = 1001
    GROUP  BY id
    order by max(date)
    )
    where Rn = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多