问题 如何在包含最大值的表中查找记录?


虽然这个问题看起来很简单,但它有点棘手。

我有一个包含以下列的表:

table A:
  int ID
  float value
  datetime date
  varchar(50) group

我想获取包含按“group”列分组的最大“date”的记录的“ID”和“value”。就像是 “每个团队的最新价值是什么?”

我可以得到每个组及其最大日期:

SELECT group, MAX(date) FROM A GROUP BY group; -- I also need the "ID" and "value"

但我想拥有最高日期的记录的“ID”和值。

在A和结果之间进行连接可能是答案,但是无法知道MAX(日期)引用哪条记录(如果“日期”重复)。

有人可以帮忙吗?


2353
2017-12-18 00:17


起源



答案:


您可以尝试使用子查询

从A中选择组,ID,值,日期
(选择MAX(日期)作为日期
  来自A.
  逐组)
按组排序

8
2017-12-18 00:25





这就是分析函数的用途:

select group,
       id,
       value
from   (
       select group,
              id,
              value,
              date,
              max(date) over (partition by group) max_date_by_group
       from A
       )
where  date = max_date_by_group

4
2017-12-18 01:24





如果日期是唯一的,那么您已经有了答案。如果date不是唯一的,那么您需要一些其他的uniqueifier。如果没有自然密钥,您的身份证会就像任何身份一样好。只需将MAX(或MIN,无论哪种)放在上面:

SELECT *
FROM A
JOIN (
    --Dedupe any non unqiue dates by getting the max id for each group that has the max date
    SELECT Group, MAX(Id) as Id
    FROM A 
    JOIN (
        --Get max date for each group
        SELECT group, MAX(date) as Date 
        FROM A 
        GROUP BY group
    ) as MaxDate ON
        A.Group = MaxDate.Group
        AND A.Date = MaxDate.Date
    GROUP BY Group
) as MaxId ON
    A.Group = MaxId.Group
    AND A.Id= MaxId.Id

2
2017-12-18 03:17





只要Date列对于每个组都是唯一的,我认为这样的事情可能会起作用:

SELECT A.ID, A.Value
FROM A
  INNER JOIN (SELECT Group, MAX(Date) As MaxDate FROM A GROUP BY Group) B
    ON A.Group = B.Group AND A.Date = B.MaxDate

0
2017-12-18 00:26



它不是唯一的 - Jonas
这使得很难找到每个组的最新记录:] - Andrew Kennan


答案:


您可以尝试使用子查询

从A中选择组,ID,值,日期
(选择MAX(日期)作为日期
  来自A.
  逐组)
按组排序

8
2017-12-18 00:25





这就是分析函数的用途:

select group,
       id,
       value
from   (
       select group,
              id,
              value,
              date,
              max(date) over (partition by group) max_date_by_group
       from A
       )
where  date = max_date_by_group

4
2017-12-18 01:24





如果日期是唯一的,那么您已经有了答案。如果date不是唯一的,那么您需要一些其他的uniqueifier。如果没有自然密钥,您的身份证会就像任何身份一样好。只需将MAX(或MIN,无论哪种)放在上面:

SELECT *
FROM A
JOIN (
    --Dedupe any non unqiue dates by getting the max id for each group that has the max date
    SELECT Group, MAX(Id) as Id
    FROM A 
    JOIN (
        --Get max date for each group
        SELECT group, MAX(date) as Date 
        FROM A 
        GROUP BY group
    ) as MaxDate ON
        A.Group = MaxDate.Group
        AND A.Date = MaxDate.Date
    GROUP BY Group
) as MaxId ON
    A.Group = MaxId.Group
    AND A.Id= MaxId.Id

2
2017-12-18 03:17





只要Date列对于每个组都是唯一的,我认为这样的事情可能会起作用:

SELECT A.ID, A.Value
FROM A
  INNER JOIN (SELECT Group, MAX(Date) As MaxDate FROM A GROUP BY Group) B
    ON A.Group = B.Group AND A.Date = B.MaxDate

0
2017-12-18 00:26



它不是唯一的 - Jonas
这使得很难找到每个组的最新记录:] - Andrew Kennan