以不同的方式排序
Order by with distinct
首先是我的 sql:
SELECT DISTINCT(CarTable.CarPlate), CarTable.CarImage, EventTable.FirstDate
FROM CarTable JOIN EventTable ON CarTable.CarId = EventTable.CarId
ORDER BY 3 DESC
我正在尝试按日期对行进行排序并且效果很好,但我希望所有的盘子只写一次。我的意思是我需要查看所有汽车的最后一个事件,但似乎我使用的明显错误。这样做的最佳方法是什么?
使用MAX
和GROUP 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
注:
- 使用有意义的别名来提高可读性。
或者 window 和 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
看看,如果不使用聚合函数,这是否有效。
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
首先是我的 sql:
SELECT DISTINCT(CarTable.CarPlate), CarTable.CarImage, EventTable.FirstDate
FROM CarTable JOIN EventTable ON CarTable.CarId = EventTable.CarId
ORDER BY 3 DESC
我正在尝试按日期对行进行排序并且效果很好,但我希望所有的盘子只写一次。我的意思是我需要查看所有汽车的最后一个事件,但似乎我使用的明显错误。这样做的最佳方法是什么?
使用MAX
和GROUP 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
注:
- 使用有意义的别名来提高可读性。
或者 window 和 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
看看,如果不使用聚合函数,这是否有效。
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