Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按问题分组-需要获取唯一列组合的最新行_Sql_Sql Server - Fatal编程技术网

Sql 按问题分组-需要获取唯一列组合的最新行

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

我的表结构(在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 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)