13

Tôi đang sử dụng mã này: (từ câu hỏi này: How to get the last record per group in SQL thay thế các cột của riêng tôi)Có thể sử dụng ROW_NUMBER() OVER/PARTITION BY chỉ khi một cột khác không?

WITH e AS 
(
SELECT *, 
    ROW_NUMBER() OVER 
    (
     PARTITION BY ApplicationId 
     ORDER BY theDate DESC 
    ) AS Recency 
FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 

Có thể 'phân vùng' chỉ khi hai lĩnh vực đều giống nhau? Ví dụ tôi có dữ liệu như thế này:

ID  Name theDate 
123  John 01/01/2012 
123  John 01/02/2012 
123  Doe  01/01/2012 
456  Smith 02/04/2012 
789  Smith 02/01/2012 
789  Smith 02/09/2012 
789  Roger 02/08/2012 

Từ dữ liệu mà tôi muốn quay trở lại:

ID  Name theDate 
123  John 01/02/2012 
123  Doe  01/01/2012 
456  Smith 02/04/2012 
789  Smith 02/09/2012 
789  Roger 02/08/2012 

Cảm ơn sự giúp đỡ nào.

Thomas

+0

Câu trả lời giống nhau để trì hoãn số cũ nhất –

+0

Đây phải là bài tập về nhà. – JeffO

+0

@ JeffO nope ... Tôi chỉ cố gắng không dán dữ liệu khách hàng khi tôi có thể trợ giúp. – tsdexter

Trả lời

4

tôi đã tìm thấy nó câu trả lời ở đây: Table partitioning using 2 columns

Bạn chỉ có thể phân vùng trên 1 cột, tuy nhiên cột đó có thể được tạo để tạo 'nhiều phân vùng' như sau:

WITH e AS 
( 
SELECT *, 
ROW_NUMBER() OVER 
( 
    PARTITION BY CONVERT(VARCHAR(100),ApplicationId) + ' ' + Name 
    ORDER BY theDate DESC 
) AS Recency 
FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 

Việc thêm hai cột lại với nhau thành một chuỗi duy nhất đảm bảo nó sẽ chỉ phân vùng nếu cả hai cột giống nhau.

+2

Tôi nghĩ rằng bạn đang bối rối 'phân vùng bảng' với' PARTITION BY' - trong khi chúng được đặt tên tương tự, chúng không liên quan theo bất kỳ cách nào. Bạn chắc chắn không bị giới hạn trong một cột hoặc biểu thức trong 'PARTITION BY' và không cần cái gọi là 'nhiều phân vùng' của bạn ... –

+0

@AaronBertrand vâng tôi nhận ra rằng liên kết tôi đăng là về chia bảng và tôi ' Tuy nhiên, bằng cách sử dụng PARTITION BY, người trả lời câu hỏi đó cũng áp dụng ở đây. Đề xuất trên (field1, field2) không hoạt động để trả về dữ liệu tôi cần, trong khi mã tôi cung cấp cơ sở không trả lời trong liên kết (Field1 + '' + Field2) cung cấp dữ liệu thích hợp ... đây không phải là cách chính xác để làm điều đó? – tsdexter

+0

@AaronBertrand Tôi đã không kiểm tra đầy đủ kết quả nhưng tôi nghĩ PARTITION BY field1, field2 phân vùng đầu tiên trên trường đầu tiên và sau đó phân vùng tiếp theo kết quả trên trường thứ hai, đúng không? Đó không phải là những gì tôi cần. – tsdexter

30

Bạn có thể đã nhiều cột phân cách bằng dấu phẩy

WITH e AS 
( 
SELECT *, 
    ROW_NUMBER() OVER 
    ( 
     PARTITION BY ApplicationId , Name 
     ORDER BY theDate DESC 
    ) AS Recency 
FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 
+0

Bạn đã thử điều đó chưa? Tài liệu về Over (http://msdn.microsoft.com/en-us/library/ms189461.aspx) không rõ ràng về số lượng cột bạn có thể chỉ định. – 000

+0

Điều này không hoạt động như dự định. Nó vẫn phân vùng TẤT CẢ những cái có cùng ID và sau đó tôi giả sử các phân vùng tiếp theo dựa trên cột thứ hai. Xem câu trả lời của tôi tôi đã thêm. – tsdexter

+2

+1. Điều này hoạt động chính xác như dự định và cung cấp câu trả lời chính xác mà bạn đã yêu cầu trong câu hỏi. Nếu không, bạn cần giải thích như thế nào. Tôi nghi ngờ bạn đã không thực sự thử nghiệm nó bởi vì mô tả của bạn về cách nó không hoạt động không phù hợp với những gì nó thực sự làm. –

Các vấn đề liên quan