【问题标题】:Order by with distinct以不同的方式排序
【发布时间】:2016-04-19 07:09:15
【问题描述】:

首先是我的 sql:

SELECT DISTINCT(CarTable.CarPlate), CarTable.CarImage, EventTable.FirstDate
FROM CarTable JOIN EventTable ON CarTable.CarId = EventTable.CarId
ORDER BY 3 DESC

我正在尝试按日期对行进行排序,效果很好,但我希望所有车牌只写一次。我的意思是我需要查看所有汽车的最后一次活动,但似乎我使用了明显的错误。这样做的最佳方法是什么?

【问题讨论】:

  • DISTINCT 不是列上的函数,它是SELECT DISTINCT 的一部分,适用于整个选定的行。 IE。 SELECT DISTINCT(CarTable.CarPlate), CarTable.CarImage,...SELECT DISTINCT CarTable.CarPlate, CarTable.CarImage... 相同,与SELECT DISTINCT CarTable.CarPlate , (CarTable.CarImage)... 相同。

标签: sql sql-server sql-order-by distinct


【解决方案1】:

使用MAXGROUP BY

SELECT 
    c.CarPlate, 
    c.CarImage, 
    FirstDate = MAX(e.FirstDate)
FROM CarTable c
INNER JOIN EventTable e
    ON c.CarId = e.CarId
GROUP BY c.CarPlate, c.CarImage
ORDER BY MAX(e.FirstDate) DESC

注意:

  • 使用有意义的别名来提高可读性。

【讨论】:

  • @jarlh 谢谢!已更新。
  • 我将 'c' 替换为 'e' 用于 MAX 函数,它成功了。谢谢你:)
【解决方案2】:

看看,如果这个工作不使用聚合函数。

SELECT c.CarPlate
    ,c.CarImage
    ,ev.FirstDate
FROM CarTable C
CROSS APPLY (
    SELECT max(FirstDate) FirstDate
    FROM EventTable E
    WHERE c.CarId = e.CarId
    ) ev
ORDER BY ev.FirstDate DESC

【讨论】:

    【解决方案3】:

    或者用窗口和DISTINCT

    SELECT DISTINCT 
      C.CarId,
      C.CarImage, 
      MAX(E.FirstDate) OVER (PARTITION BY E.CarId) FirstDate
    FROM CarTable C
    JOIN EventTable E ON C.CarId = E.CarId
    ORDER BY FirstDate DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      相关资源
      最近更新 更多