我有一个类似于以下内容的表,但是还有更多这个实例不需要的列。
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会做什么?
答案 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