【问题标题】:Create SQL string - probably involving DISTINCT, GROUP BY or ..?创建 SQL 字符串 - 可能涉及 DISTINCT、GROUP BY 或 ..?
【发布时间】:2012-04-25 04:55:28
【问题描述】:

我有这张表 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",但这显然会根据两列返回不同的结果——这显然不是我想要的:)

【问题讨论】:

  • 你为什么想要一个任意的 ID?
  • 对不起,我不明白你的问题。 Ids 只是自动生成并为每个新行增加 1 - 我错过了什么吗?
  • 我认为 LINQ 只是一个示例。但无论如何,First 不会返回最低、最旧、最新或最高的 ID,只是一个任意 ID。与 SQL 中的 MAX 或 MIN 相同。因此我问你为什么需要这个ID,因为它没有意义。
  • 啊。当我试图写“如果项目按数据分组时,所有 Id 都是连续的”。我的意思是按数据分组将包含一个不与任何其他分组 Id 重叠的 Id 间隔。因此,来自所有组的任意 ID 将给出正确的顺序(编辑:组)。

标签: c# sql-server linq tsql


【解决方案1】:

你可以试试这个吗?

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

更新:

由于id应该是一个聚合函数,和作者的要求无关,所以我用了max函数,我猜任何其他函数都可以用。

【讨论】:

  • 当id不在select子句中时,你不能按id排序。
  • 这在 T-SQL 中不起作用。您不能排序或选择不属于 group by 的列或以其他方式聚合的列(例如 MAX(ID))。
  • 不,抱歉(我也试过了) - 这给出了异常:列 'Test.Id' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 中子句。
  • 正如我已经说过的,您不能按不属于 group by 或聚合的列进行排序。所以你还需要在Order By中应用MAX。
  • @JoeTuskan:它有效。他想要最高的 ID(实际上是一个任意的 ID)并且他得到每个数据组的最高 ID。那么它有什么问题呢?
【解决方案2】:
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

我会试试这个

【讨论】:

  • order by 将如何在这里工作。请看我的回答评论。
  • @sarwar026,它是测试表的成员。
  • 哦,真的很抱歉。下次我应该更加谨慎。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2010-09-30
  • 1970-01-01
  • 2020-11-05
  • 2014-11-07
  • 1970-01-01
  • 2016-03-08
相关资源
最近更新 更多