Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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
C# 创建SQL字符串-可能涉及DISTINCT、GROUP BY或。。?_C#_Sql Server_Linq_Tsql - Fatal编程技术网

C# 创建SQL字符串-可能涉及DISTINCT、GROUP BY或。。?

C# 创建SQL字符串-可能涉及DISTINCT、GROUP BY或。。?,c#,sql-server,linq,tsql,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 s

我有一个表
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);
    }
}
类行
{
公共int Id{get;set;}
公共字符串数据{get;set;}
}
公共静态类MyTestClass
{
公共静态无效测试()
{
IEnumerable rows=新列表
{
新行{Id=1,Data=“42”},
新行{Id=2,Data=“42”},
新行{Id=3,Data=“11”},
新行{Id=4,Data=“11”},
新行{Id=5,Data=“11”},
新行{Id=6,Data=“65”},
};
var result=rows.GroupBy(r=>r.Data)
.OrderByDescending(g=>g.First().Id)
.选择(g=>g.Key)
.ToList();
var str=string.Join(“,result”);
控制台写入线(str);
}
}
这将打印:

六十五

十一,

42

我如何用SQL(对于MS SQL)高效地编写这篇文章?我使用过不同的解决方案,如“按Id DESC从测试顺序中选择不同的数据,Id”,但这显然会根据两列返回不同的结果-这显然不是我想要的:)

你能试试吗

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

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

你能试试这个吗

SELECT Data, MAX(Id)
FROM Test 
GROUP BY Data
ORDER BY MAX(Id) DESC
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
更新:

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

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
我想试试这个



如果select子句中没有id,我会尝试此方法。

您不能按id订购。这在T-SQL中不起作用。您不能按排序或选择不属于group by的列或以其他方式聚合的列(f.e.MAX(ID))。不,抱歉(我也尝试过)-这会产生异常:列“Test.ID”在select列表中无效,因为它不包含在聚合函数或group by子句中。正如我已经说过的,不能按不属于分组依据或聚合的列进行排序。因此,您还需要在@JoeTuskan的
顺序中应用
MAX
:它起作用。他想要最高的ID(实际上是一个任意的ID),并获得每个数据组的最高ID。那么它有什么问题呢?当select子句中没有id时,您不能按id订购。这在T-SQL中不起作用。您不能按排序或选择不属于group by的列或以其他方式聚合的列(f.e.MAX(ID))。不,抱歉(我也尝试过)-这会产生异常:列“Test.ID”在select列表中无效,因为它不包含在聚合函数或group by子句中。正如我已经说过的,不能按不属于分组依据或聚合的列进行排序。因此,您还需要在@JoeTuskan的
顺序中应用
MAX
:它起作用。他想要最高的ID(实际上是一个任意的ID),并获得每个数据组的最高ID。那怎么了?你为什么想要一个任意的身份证?对不起,我不明白你的问题。ID是自动生成的,并且每增加一行就增加1—我是否遗漏了什么?我以为LINQ只是一个示例。但无论如何,
First
不会返回最低、最旧、最新或最高的ID,只是一个任意ID。与SQL中的
MAX
MIN
相同。所以我问你为什么需要这个身份证,因为它没有任何意义。当我试图写“如果项目按数据分组,那么所有Id都是连续的”。我的意思是,按数据分组将包含一个不与任何其他分组ID重叠的ID间隔。因此,来自所有组的任意ID将给出正确的顺序(编辑:组)。如果你写的是,这意味着Id与结果无关,你是绝对正确的:)-英语不是我的口语,有时我不容易把它弄对。你为什么想要一个任意的Id?对不起,我不明白你的问题。ID是自动生成的,并且每增加一行就增加1—我是否遗漏了什么?我以为LINQ只是一个示例。但无论如何,
First
不会返回最低、最旧、最新或最高的ID,只是一个任意ID。与SQL中的
MAX
MIN
相同。所以我问你为什么需要这个身份证,因为它没有任何意义。当我试图写“如果项目按数据分组,那么所有Id都是连续的”。我的意思是,按数据分组将包含一个不与任何其他分组ID重叠的ID间隔。因此,来自所有组的任意ID将给出正确的顺序(编辑:组)。如果你写道这意味着ID与结果无关,你是绝对正确的:)-英语不是我的口语,有时我不容易把它弄对。这里的顺序是如何工作的。请看我答案的注释。@sarwar026,它是测试表的一员。哦,真的很抱歉。下一次我应该更加小心。这里的订货方式如何。请看我答案的注释。@sarwar026,它是测试表的一员。哦,真的很抱歉。下次我应该更加小心。