如何在同一个SELECT语句中使用DISTINCT和ORDER BY?

执行以下语句之后:

SELECT Category FROM MonitoringJob ORDER BY CreationDate DESC 

我从数据库中获得以下值:

 test3 test3 bildung test4 test3 test2 test1 

但我想删除重复项,如下所示:

 bildung test4 test3 test2 test1 

我试图使用DISTINCT,但它不能在一个语句中使用ORDER BY。 请帮忙。

重要:

  1. 我尝试过:

     SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC 

    它不工作。

  2. 由CreationDatesorting非常重要。

    问题是ORDER BY中使用的列没有在DISTINCT指定。 为此,您需要使用聚合函数进行sorting,并使用GROUP BY使DISTINCT正常工作。

    尝试这样的事情:

     SELECT DISTINCT Category, MAX(CreationDate) FROM MonitoringJob GROUP BY Category ORDER BY MAX(CreationDate) DESC, Category 

    如果不需要MAX(Cre​​ationDate)的输出 – 就像原始问题的例子 – 唯一的答案是Prashant Gupta的答案的第二个陈述:

     SELECT [Category] FROM [MonitoringJob] GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC 

    说明:不能在内联函数中使用ORDER BY子句,因此在这种情况下,Prutswonder的答案中的语句是不可用的,您不能在外部select它并放弃MAX(Cre​​ationDate)部分。

    只要使用这个代码,如果你需要[Category]和[CreationDate]列的值

     SELECT [Category], MAX([CreationDate]) FROM [MonitoringJob] GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC 

    或者使用这个代码,如果你只想要[Category]列的值。

     SELECT [Category] FROM [MonitoringJob] GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC 

    你会有所有不同的logging你想要的。

    2)由CreationDate命令是非常重要的

    原始结果表明“test3”有多个结果…

    开始使用MAX可以非常容易地删除Group By …中的重复项,并忘记或忽略潜在的问题…

    OP大概意识到,使用MAX给他最后的“创造”和使用MIN会给第一个“创造”…

    不同将按升序对logging进行sorting。 如果你想按desc顺序sorting使用:

     SELECT DISTINCT Category FROM MonitoringJob ORDER BY Category DESC 

    如果您想根据CreationDate字段对logging进行sorting,则该字段必须位于select语句中:

     SELECT DISTINCT Category, creationDate FROM MonitoringJob ORDER BY CreationDate DESC 
     if object_id ('tempdb..#tempreport') is not null begin drop table #tempreport end create table #tempreport ( Category nvarchar(510), CreationDate smallint ) insert into #tempreport select distinct Category from MonitoringJob (nolock) select * from #tempreport ORDER BY CreationDate DESC 

    你可以使用CTE:

     WITH DistinctMonitoringJob AS ( SELECT DISTINCT Category Distinct_Category FROM MonitoringJob ) SELECT Distinct_Category FROM DistinctMonitoringJob ORDER BY Distinct_Category DESC 

    尝试下一步,但对大量数据无用

     SELECT DISTINCT Cat FROM ( SELECT Category as Cat FROM MonitoringJob ORDER BY CreationDate DESC ); 

    这可以使用内部查询来完成像这样

     $query = "SELECT * FROM (SELECT Category FROM currency_rates ORDER BY id DESC) as rows GROUP BY currency"; 
     SELECT DISTINCT Category FROM MonitoringJob ORDER BY Category ASC