Bạn có thể sử dụng một hàm cửa sổ, chẳng hạn như hàm xếp hạng có tên là
WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
5 để tạo một chuỗi số trong một nhóm [WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
6] của mỗi WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
7 được sắp xếp theo thứ tự giảm dần của WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
8, như vậySELECT ID, Person, MeetingDate
FROM
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC] AS SortId
FROM MyTable
] AS Subquery
WHERE SortId = 1
Bạn cũng có thể sử dụng biểu thức bảng chung [CTE] thay vì truy vấn con để sắp xếp mọi thứ nếu bạn thích
WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
Sự khác biệt giữa việc sử dụng truy vấn con và CTE chủ yếu chỉ là ưu tiên về tổ chức/khả năng đọc, nhưng CTE có thể hữu ích để giữ cho mã sạch hơn nếu bạn cần xâu chuỗi nhiều chuỗi lại với nhau để thực hiện các thao tác dữ liệu bổ sung [trái ngược với nhiều cấp truy vấn con]
Lưu ý, bbaird đưa ra một nhận xét rất công bằng rằng nếu bạn gặp trường hợp cùng một
WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
7 có hai hàng khác nhau với cùng một WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
8 chính xác thì các truy vấn trước đây của tôi ở trên là không xác định và có thể trả về một SELECT * FROM exam ORDER BY exam_date ASC;1 khác từ trong cùng một nhóm
WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
8 và WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
7 Ví dụ: nếu có hai hàng trong
WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
2 cho WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
7 A có WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
8 25/10/2021, một hàng có SELECT * FROM exam ORDER BY exam_date ASC;1 1 và hàng kia có
SELECT * FROM exam ORDER BY exam_date ASC;1 2, thì thứ tự chỉ trên trường
WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
8 là không xác định vì nó giống nhau cho hai trường WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
8 . Nói cách khác, hàng nào đến trước khi các giá trị được sắp xếp hoàn toàn giống nhau? Để khắc phục điều đó, bạn cần đảm bảo rằng bạn đặt hàng theo một biểu thức duy nhất. Nếu cột
SELECT * FROM exam ORDER BY exam_date ASC;1 của bạn được đảm bảo là
WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
1 thì trong trường hợp bạn có hai hàng có cùng một WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
8 cho cùng một WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
7, bạn cũng có thể thêm SELECT * FROM exam ORDER BY exam_date ASC;1 vào cuối mệnh đề order by của hàm cửa sổ để đảm bảo rằng bạn luôn nhận được . Nếu bạn muốn giá trị lớn nhất [thường là mới nhất - tùy thuộc vào cách bạn tạo chúng] giá trị
SELECT * FROM exam ORDER BY exam_date ASC;1 khi có hai hàng cho cùng một
WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
7 với cùng một WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
8 thì bạn sẽ đặt hàng theo trường SELECT * FROM exam ORDER BY exam_date ASC;1 giảm dần
Sử dụng từ khóa
SELECT * FROM exam ORDER BY exam_date ASC;2 và tên của cột mà bạn muốn sắp xếp. Bằng cách này, bạn sẽ sắp xếp dữ liệu theo thứ tự tăng dần theo cột này. Bạn cũng có thể sử dụng từ khóa
SELECT * FROM exam ORDER BY exam_date ASC;3 để làm rõ rằng thứ tự tăng dần [ngày sớm nhất được hiển thị đầu tiên, ngày mới nhất được hiển thị cuối cùng, v.v. ]
SELECT * FROM exam ORDER BY exam_date ASC;
Nếu bạn muốn xem ngày mới nhất trước và ngày sớm nhất cuối cùng, bạn cần sắp xếp theo thứ tự giảm dần. Sử dụng từ khóa
SELECT * FROM exam ORDER BY exam_date ASC;4 trong trường hợp này
Lưu ý rằng trong MySQL, các
SELECT * FROM exam ORDER BY exam_date ASC;5 được hiển thị đầu tiên khi sắp xếp theo thứ tự tăng dần và cuối cùng khi sắp xếp theo thứ tự giảm dần. Ngoài ra, các hàng có cùng
SELECT * FROM exam ORDER BY exam_date ASC;9 được hiển thị theo thứ tự ngẫu nhiên [bạn có thể thấy
SELECT * FROM exam ORDER BY exam_date ASC;7 thứ ba và
SELECT * FROM exam ORDER BY exam_date ASC;8 thứ tư, hoặc
SELECT * FROM exam ORDER BY exam_date ASC;8 thứ ba và
SELECT * FROM exam ORDER BY exam_date ASC;7 thứ tư]
ví dụ 2
Bảng
SELECT * FROM exam ORDER BY exam_date ASC;0 có các cột sau.
SELECT * FROM exam ORDER BY exam_date ASC;1,
SELECT * FROM exam ORDER BY exam_date DESC;3,
SELECT * FROM exam ORDER BY exam_date DESC;4 và
SELECT * FROM exam ORDER BY exam_date DESC;5. Các tháng được đặt tên, không phải bằng sốmônexam_yearexam_monthexam_dayToán học2019Tháng mười hai19Tiếng Anh2020Tháng một8Khoa học2020Tháng15Sức khỏe2020Tháng một5Nghệ thuậtNULLNULLNULL
Bạn muốn sắp xếp các hàng theo ngày thi
Dung dịch
WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
7Kết quả trông như thế này [các hàng được sắp xếp theo thứ tự tăng dần bởi
SELECT * FROM exam ORDER BY exam_date DESC;3,
SELECT * FROM exam ORDER BY exam_date DESC;4 và
SELECT * FROM exam ORDER BY exam_date ASC;9]
Thảo luận
Để sắp xếp theo ngày, hãy tạo các giá trị ngày từ các giá trị năm, tháng và ngày. Để thực hiện việc này, hãy sử dụng hàm STR_TO_DATE[]. Nếu bạn có một ngày được lưu trữ dưới dạng một chuỗi ở định dạng '
SELECT * FROM exam ORDER BY exam_date DESC;9', bạn có thể chuyển nó thành một ngày bằng cách sử dụng
WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
70. Nhưng trước tiên, bạn cần tạo một chuỗi bằng hàm CONCAT[]WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
2Hàm
WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
71 kết hợp tất cả các đối số thành một chuỗi. Bạn không cần truyền số thành chuỗi. Vì bạn muốn lấy một chuỗi ở định dạng 'SELECT * FROM exam ORDER BY exam_date DESC;9', nên các đối số là
SELECT * FROM exam ORDER BY exam_date DESC;3,
SELECT * FROM exam ORDER BY exam_date DESC;4,
SELECT * FROM exam ORDER BY exam_date DESC;5 và khoảng cách giữa chúng
Sau đó, bạn cần chuyển đổi chuỗi này thành ngày tháng bằng hàm
WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
70. Đối số thứ hai của hàm này là định dạng ngày tháng. WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
77 là viết tắt của năm, WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
78 là viết tắt của tháng [tên đầy đủ của nó, không phải là số] và WITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
79 là viết tắt của ngàyWITH CTE_MyTable_Sorted AS
[
SELECT
ID,
Person,
MeetingDate,
ROW_NUMBER[] OVER [PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC] AS SortId
FROM MyTable
]
SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
2Sử dụng nó với mệnh đề
SELECT * FROM exam ORDER BY exam_date ASC;2 để sắp xếp các hàng theo thứ tự tăng dần theo ngày. Nếu bạn muốn xem các hàng theo thứ tự giảm dần, chỉ cần thêm từ khóa
SELECT * FROM exam ORDER BY exam_date ASC;4, như thế này