2

我有这个表Test { Id:int, data:string }- 一个有两列和 n 行的表。

事实:

  • Id 是唯一的(并说明添加项目的顺序)
  • 数据可以有重复
  • 如果项目按数据分组,则所有 Id 都是连续的

在 LINQ 中,我会做类似的事情:

class Row
{
    public int Id      { get; set; }
    public string Data { get; set; }
}
public static class MyTestClass
{
    public static void Test()
    {
        IEnumerable<Row> rows = new List<Row>
        {
            new Row { Id = 1, Data = "42"},
            new Row { Id = 2, Data = "42"},
            new Row { Id = 3, Data = "11"},
            new Row { Id = 4, Data = "11"},
            new Row { Id = 5, Data = "11"},
            new Row { Id = 6, Data = "65"},
        };
        var result = rows.GroupBy(r => r.Data)
                         .OrderByDescending(g => g.First().Id)
                         .Select(g => g.Key)
                         .ToList();
        var str = string.Join(" ", result);
        Console.WriteLine(str);
    }
}

这将打印:

65

11

42

如何在 SQL 中以有效的方式编写此代码(对于 MS SQL)?我一直在使用不同的解决方案,"SELECT DISTINCT Data, Id FROM Test ORDER BY Id DESC"但显然这会根据两列返回不同的结果——这显然不是我想要的:)

4

2 回答 2

4

你能试试这个吗?

SELECT Data, MAX(Id)
FROM Test 
GROUP BY Data
ORDER BY MAX(Id) DESC

更新:

由于 Id 应该带有聚合函数,并且与作者的要求无关,因此我使用了 MAX 函数,我猜可以使用任何其他函数。

于 2012-04-12T19:34:17.230 回答
0
SELECT DISTINCT Test.Data
FROM (SELECT Data
    FROM Test
    GROUP BY Data) as Grouping
    INNER JOIN Test on Test.Data = Grouping.Data
ORDER BY Test.Id DESC

我会试试这个

于 2012-04-12T19:47:54.160 回答