4

我有一个看起来像这样的表:

   Date   | AttributeId | Score |
4/4/2013         1         0.64      
4/6/2013         2         0.35
4/6/2013         1         0.86
4/4/2013         5         0.34
4/4/2013         4         0.23
4/7/2013         3         0.54
4/8/2013         1         0.66

我可以在 MS SQL 中构造一个查询,以便我只获得特定 AttributeID 的最后一次出现吗?从上面的示例中,查询将返回:

   Date   | AttributeId | Score |     
4/6/2013         2         0.35
4/4/2013         5         0.34
4/4/2013         4         0.23
4/7/2013         3         0.54
4/8/2013         1         0.66

如果有帮助,我知道只有 5 个 AttributeID(1-5)并且它们不会改变。

目前我正在查询最后 15 条记录(并希望这些记录包含我所有的 5 个属性),然后在应用程序级别上,提取所有 5 个属性的最新分数。
有更好的解决方案吗?

编辑:
另外,如果我有Date、和UserId,我可以以某种方式将我的结果分组吗? 当我尝试你的答案时,我看到我只得到最新的结果,不管是哪个。 对不起,我应该早点 提到AttributeIdScoreUserId
UserId
UserId

编辑 2:我需要按属性获取每个用户的最新分数,并将他们的分数平均在属性上。示例如下所示:

   Date   |  UserId  | AttributeId | Score |
4/4/2013        1           1         0.64      
4/6/2013        1           1         0.35
4/6/2013        2           1         0.86
4/4/2013        1           3         0.34
4/4/2013        2           3         0.23
4/7/2013        2           1         0.54
4/8/2013        1           5         0.69
4/4/2013        2           4         0.27
4/7/2013        2           2         0.54
4/9/2013        1           4         0.66
4/9/2013        2           2         0.58
4/10/2013       1           4         0.66
4/9/2013        1           2         0.33
4/11/2013       2           5         0.10

第一个结果如下所示:

   Date   |  UserId  | AttributeId | Score |
4/6/2013        1           1         0.64      
4/9/2013        1           2         0.33
4/4/2013        1           3         0.34
4/10/2013       1           4         0.66
4/8/2013        1           5         0.69
4/7/2013        2           1         0.86
4/9/2013        2           2         0.58
4/4/2013        2           3         0.23
4/4/2013        2           4         0.27
4/11/2013       2           5         0.10

平均分数后的最后一个结果UserId

UserId | AverageScore |
   1           0.532     
   2           0.408 
4

2 回答 2

10
SELECT  *
FROM    (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY attributeId ORDER BY [date] DESC) rn
        FROM    mytable
        ) q
WHERE   rn = 1

如果您有一个固定列表,但只有几个属性(或带有它们的表),则此查询可能更有效:

SELECT  *
FROM    attribute a
OUTER APPLY
        (
        SELECT  TOP 1
                [date], score
        FROM    score s
        WHERE   attributeId = a.id
        ORDER BY
                [date] DESC
        ) s

创建索引:

CREATE INDEX
        ix_score_attribute_date__score
ON      score (attributeId, date)
INCLUDE (score)

让这个查询快速工作。

更新:

要选择每个用户的平均最新分数,请使用以下命令:

SELECT  userId, AVG(score)
FROM    (
        SELECT  userId, score
        FROM    (
                SELECT  *
                        ROW_NUMBER() OVER (PARTITION BY userId, attributeId ORDER BY [date] DESC) rn
                FROM    score
                ) s
        WHERE   rn = 1
        ) q
GROUP BY
        userId
于 2013-04-30T08:56:02.570 回答
1
WITH records
AS
(
    SELECT  [Date], AttributeId, Score,
            DENSE_RANK() OVER (PARTITION BY AttributeId ORDER BY [Date] DESC) rn
    FROM    TableName
)
SELECT  [Date], AttributeId, Score
FROM    records
WHERE   rn = 1
于 2013-04-30T08:55:50.597 回答