Sql 按问题分组-需要获取唯一列组合的最新行
我的表结构(在SQL Server中)如下所示:(D1比D2更近,PK是一个普通的Sql 按问题分组-需要获取唯一列组合的最新行,sql,sql-server,Sql,Sql Server,我的表结构(在SQL Server中)如下所示:(D1比D2更近,PK是一个普通的标识(1,1)列) 我需要做的是为名称和类型的每个唯一组合找到最新的分数值,即: A1 B1 C1 D1 A1 B2 C2 D1 我最初只是使用昨天的日期来完成这项工作,但并不是每天都更新,所以有时分数会丢失。 我可以用一个简单的方法得到我需要查看的独特组合 SELECT Name, Type FROM Table GROUP BY Name, Type ORDER BY
标识(1,1)
列)
我需要做的是为名称
和类型
的每个唯一组合找到最新的分数
值,即:
A1 B1 C1 D1
A1 B2 C2 D1
我最初只是使用昨天的日期来完成这项工作,但并不是每天都更新,所以有时分数会丢失。
我可以用一个简单的方法得到我需要查看的独特组合
SELECT Name, Type FROM Table GROUP BY Name, Type ORDER BY MAX(Date)
但我显然无法添加其他两列,或者组不再是唯一的
我已经看过类似的问题,但它们都有不同之处,这使得它们对我来说用处不大
非常感谢您的帮助。我有一种感觉,这是一个相当简单的问题,我只是不知道足够的,以解决它 标准(ANSI)SQL解决方案:
SELECT name,
type,
score,
Date,
FROM (
SELECT name,
type,
score,
Date,
row_number() over (partition by name, type order by Date desc) as rn
FROM your_table
) t
WHERE rn = 1
根据您的DBMS,您可能需要引用列名“Type”和“Date”,因为它们是保留字。据我所知,实现这一点的最佳方法是使用自连接,如果它必须与数据库无关的话
SELECT s.Name, s.Type, s.Score
FROM (
SELECT Name, Type, MAX(Date) AS MaxDate
FROM Scores
GROUP BY Name, Type
) m
INNER JOIN Scores s ON m.Name = s.Name AND m.Type = s.Type AND m.MaxDate = s.Date
SELECT name, type, date, t2.score
FROM (SELECT name, type, MAX (date) date
FROM testdata
GROUP BY name, type) t1
JOIN
testdata t2 USING (name, type, date)
您使用的是哪台SQL server是mysql、postresql、oracle、microsoft SQL?…表上有PK列吗?@Bob谢谢您的建议,我已经添加了clarification@BonyT同上,每个评论只能标记一个人
name
不能是包含此数据的PK。@一匹没有名字的马完美,这正是我需要的。不过,我不太清楚它是如何工作的,所以我将查找分区和上的:)为了清楚起见,列名只是别名,顺便说一句,但谢谢。@Alex:你可能还想测试marc的答案,看看哪一个性能更好。@a_horse_没有名字是的,我将运行两个测试,我可能不得不切换已接受的答案,因为他的眼睛(可能还有db!)更容易观察。@Alex:(名称、类型、日期)
上的索引对两个版本都有好处。@ypercube是的,我对事物进行了更好的索引,而且速度更快,谢谢。这也非常有效。这比没有名字的@a_horse_有什么好处,反之亦然?这一点实际上看起来更容易理解。一个优点是,它可以在没有分析功能的旧版本(或其他RDBMS,如MySQL)中运行。一个小区别是,如果对于(名称、类型)
组合,有两个或多个记录具有相同的最大日期
,此查询将返回所有这些记录,而带有“no”名称的“horse”将只返回一条记录。@marc几分钟前发布了相同的解决方案。无法在SQL Server上执行此操作-“USING”附近的语法不正确。
首先为没有包含正确的标记而道歉!
SELECT name, type, date, t2.score
FROM (SELECT name, type, MAX (date) date
FROM testdata
GROUP BY name, type) t1
JOIN
testdata t2 USING (name, type, date)