创建SQL字符串 - 可能涉及DISTINCT,GROUP BY或..?

时间:2012-04-12 19:30:40

标签: c# sql-server linq tsql

我有这个表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"这样的不同解决方案有关,但显然这会基于两列返回明显 - 这显然不是我想要的:)

2 个答案:

答案 0 :(得分:4)

你能试试吗?

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

<强>更新

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

答案 1 :(得分: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

我会尝试这个