2012-02-16 39 views
20

Tôi đang cố gắng để có được hơn và phân vùng bằng chức năng quấn quanh đầu của tôi. Đây là một ví dụ mà tôi chỉ không hiểu.Cố gắng để hiểu hơn() và phân vùng bằng cách

Đây là dữ liệu tôi có:

SALESORDERID  ORDERDATE 
43894    08/01/2001 
43664    07/01/2001 
43911    08/01/2001 
43867    08/01/2001 
43877    08/01/2001 
44285    10/01/2001 
44501    11/01/2001 
43866    08/01/2001 
43895    08/01/2001 
43860    08/01/2001 

Khi tôi chạy truy vấn này:

select Row_Number() over(partition by orderdate order by orderdate asc) 
    as Rownumber, salesorderid, orderdate 
from test2 
order by rownumber 

Dưới đây là kết quả tôi nhận được:

ROWNUMBER  SALESORDERID  ORDERDATE 
1    43664    07/01/2001 
1    43911    08/01/2001 
1    44109    09/01/2001 
1    44483    11/01/2001 
1    44285    10/01/2001 
2    43867    08/01/2001 
2    44501    11/01/2001 
3    43895    08/01/2001 
4    43894    08/01/2001 
5    43877    08/01/2001 

Ai đó có thể giải thích câu hỏi này với tôi. Tôi không phải mới đối với SQL nhưng cửa sổ tôi đã đấu tranh với và không thể có được đầu của tôi quấn quanh này.

Trả lời

26

Hãy thử đặt hàng theo ngày theo thứ tự, bạn sẽ thấy kết quả dễ dàng hơn

select Row_Number() over(partition by orderdate order by orderdate asc) 
    as Rownumber, salesorderid, orderdate 
from test2 
order by orderdate; 

nên cung cấp cho (i đã thêm dòng trống cho rõ ràng)

ROWNUMBER  SALESORDERID  ORDERDATE 
1    43664    07/01/2001 

1    43911    08/01/2001 
2    43867    08/01/2001 
3    43895    08/01/2001 
4    43894    08/01/2001 
5    43877    08/01/2001 

1    44109    09/01/2001 

1    44285    10/01/2001 

1    44483    11/01/2001 
2    44501    11/01/2001 

Bạn sẽ nhận thấy rằng kết quả được chia thành 'phân vùng', mỗi phân vùng là tập hợp các hàng có thứ tự giống hệt nhau. Đó là những gì 'phân vùng theo orderdate' có nghĩa là.

Trong phân vùng, các hàng được sắp xếp theo thứ tự, theo mệnh đề thứ hai của '(phân vùng theo thứ tự orderdate theo thứ tự asc)'. Đó không phải là rất hữu ích, vì tất cả các hàng trong một phân vùng sẽ có cùng một thứ tự. Do đó, thứ tự của các hàng trong một phân vùng là ngẫu nhiên. Hãy thử đặt hàng bởi salesorderid trong phân vùng theo mệnh đề để có kết quả có thể tái tạo nhiều hơn.

row_number() chỉ trả về trật tự của hàng trong mỗi phân vùng

+1

Cũng thử SELECT COUNT (*) OVER (phân vùng ....) có thể thậm chí rõ ràng hơn đối với bạn những gì nó làm . –

+0

Cảm ơn bạn đã trả lời. Mệnh đề phân vùng rất mạnh mẽ – Luke101

+0

Cảm ơn tốt đẹp và rõ ràng! –

9

partition by orderdate có nghĩa là bạn chỉ so sánh các bản ghi với các bản ghi khác với cùng một số orderdate. Ví dụ: trong năm bản ghi có orderdate = '08/01/2001', một bản ghi sẽ có row_number() = 1, một bản ghi sẽ có row_number() = 2, v.v.

order by orderdate asc có nghĩa là, trong một phân đoạn, số hàng sẽ được chỉ định theo thứ tự orderdate. Trong ví dụ của bạn không có hiệu lực, bởi vì bạn đã phân vùng theo orderdate, vì vậy tất cả các bản ghi trong một phân vùng sẽ có cùng một orderdate. (Nó sẽ giống như viết SELECT ... FROM t WHERE c = 6 ORDER BY c: tất cả các bản ghi đã chọn có cùng giá trị c, vì vậy, ORDER BY c không làm gì.) Vì vậy, trong một phân vùng, việc gán row_number() là tùy ý: mỗi hàng sẽ có một số khác nhau, nhưng không có đảm bảo về hàng nào sẽ có số nào.

+0

Câu trả lời này nên đã được chấp nhận thay vì – Avi

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