2012-04-12 2 views
2

У меня есть эта таблица Test { Id:int, data:string } - таблица с двумя столбцами и n строк.Создать строку SQL - возможно, с использованием DISTINCT, GROUP BY или ..?

Факты:

  • 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); 
    } 
} 

Это будет печатать:

Как я пишу это в здравницы, в SQL (для MS SQL)? Я был вокруг различных решений, таких как "SELECT DISTINCT Data, Id FROM Test ORDER BY Id DESC", но это, по-видимому, кажется, что они отличаются от обоих столбцов, что явно не то, что я хочу :)

+0

Почему вы хотите произвольный идентификатор вообще? –

+0

Жаль, что я не понимаю ваш вопрос. Идентификаторы просто автогенерируются и увеличиваются на 1 для каждой новой строки - я что-то упускаю? – Moberg

+0

Я думал, что LINQ будет просто образцом. Но в любом случае «First» не будет возвращать самый низкий, самый старый, новейший или самый высокий ID, просто произвольный идентификатор. То же, что и 'MAX' или' MIN' в SQL. Поэтому я спросил, почему вам нужен этот идентификатор, поскольку он не имеет никакого значения. –

ответ

4

Можете ли вы попробовать это?

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

UPDATE:

Поскольку Id должен быть с агрегатной функцией, и это не имеет никакого значения с требованием автора, поэтому я использовал функцию MAX, любая другая функция может быть использована, я думаю.

+1

Вы не можете выполнить заказ по id, если id не находится в предложении select. – Jeff

+1

Это не работает в T-SQL. Вы не можете заказать или выбрать столбец, который не является частью группы, или агрегируется другим способом (например, MAX (ID)). –

+0

Обновить мой код. – sarwar026

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 

Я хотел бы попробовать это

+0

Как будет выглядеть порядок здесь. См. Комментарий моего ответа. – sarwar026

+0

@ sarwar026, Это член Таблица тестов. – Joe

+0

ой, извините, действительно. В следующий раз я должен быть осторожнее. – sarwar026

Смежные вопросы