带分组和MAX的SQL查询

时间:2016-03-23 16:23:37

标签: sql

我有一个类似于以下内容的表,但是还有更多这个实例不需要的列。

ID   DATE          Random
--   --------      ---------
1    4/12/2015     2
2    4/15/2015     2
3    3/12/2015     2
4    9/16/2015     3
5    1/12/2015     3
6    2/12/2015     3

ID是主键 Random是一个外键,但我实际上并没有使用它指向的表。

我正在尝试设计一个查询,按Random和Date对结果进行分组,然后在分组中选择MAX Date,然后为我提供相关的ID。

如果我执行以下查询

select top 100 ID, Random, MAX(Date) from DateBase group by Random, Date, ID

我得到重复的Randoms,因为ID是主键,并且始终是唯一的。

我需要的结果看起来像这样

ID   DATE          Random
--   --------      ---------
2    4/15/2015     2
4    9/16/2015     3

另一个问题是,有时会有许多相同的日期。在这种情况下,MAX会做什么?

3 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS()

SELECT * FROM YourTable t
WHERE NOT EXISTS(SELECT 1 FROM YourTable s
                 WHERE s.random = t.random
                   AND s.date > t.date)

这将仅选择那些没有相应random值更大日期的人。

也可以使用IN()

完成
SELECT * FROM YourTable t
WHERE (t.random,t.date) in (SELECT s.random,max(s.date)
                            FROM YourTable s
                            GROUP BY s.random)

或者加入:

SELECT t.* FROM YourTable t
INNER JOIN (SELECT s.random,max(s.date) as max_date
            FROM YourTable s
            GROUP BY s.random) tt
 ON(t.date = tt.max_date and s.random = t.random)

答案 1 :(得分:1)

此方法适用于所有版本的SQL,因为没有供应商细节(您需要使用特定于供应商的语法格式化日期)

您可以分两个阶段完成此操作:

第一步是计算每个随机的最长日期:

SELECT  MAX(DateField) AS MaxDateField, Random
FROM    Example
GROUP BY Random

现在您可以重新加入桌面以获取每个组合的最大ID:

SELECT  MAX(e.ID) AS ID
       ,e.DateField AS DateField
       ,e.Random
FROM    Example AS e
            INNER JOIN (
                        SELECT  MAX(DateField) AS MaxDateField, Random
                        FROM    Example
                        GROUP BY Random
                       ) data
            ON data.MaxDateField = e.DateField
            AND data.Random = e.Random
GROUP BY DateField, Random

这里的SQL小提琴示例:SQL Fiddle

回答您的第二个问题:

如果有相同日期的倍数,MAX(e.ID)将只选择最高数字。如果您想要最低,则可以使用MIN(e.ID)代替。

答案 2 :(得分:1)

在SQL Server中,您可以执行以下操作,

select a.* from DateBase a inner join 
     (select Random, 
       MAX(dt) as dt from DateBase group by Random) as x 
on a.dt =x.dt and a.random = x.random