Vì vậy, tôi đang làm việc trên một câu đố golf đang và cần phải thêm một INT "number" cột n đến kết quả trong một thời gian duy trì trật tự hiện hành.
Giả sử dữ liệu nguồn của tôi là:
SELECT value
FROM STRING_SPLIT('one,two,three,four,five', ',')
trong đó trả về các mục theo thứ tự ban đầu (mong muốn):
value
-----
one
two
three
four
five
Nếu tôi cố gắng sử dụng ROW_NUMBER()
hoặc RANK()
tôi buộc phải chỉ định một ORDER BY
, đó value
là lựa chọn hợp pháp duy nhất:
SELECT value, n = ROW_NUMBER() OVER(ORDER BY value)
FROM STRING_SPLIT('one,two,three,four,five',',')
Nhưng điều này (như mong đợi) sắp xếp value
theo thứ tự abc thay vì để nó theo thứ tự ban đầu mong muốn:
value n
------ ---
five 1
four 2
one 3
three 4
two 5
Tham gia vào một bảng số không hoạt động, vì không có WHERE
điều khoản, tôi sẽ tham gia bên ngoài đầy đủ.
Về điều tốt nhất tôi có thể nghĩ ra là sử dụng bảng tạm thời với trường nhận dạng:
CREATE TABLE #argg (n INT IDENTITY(1,1), v VARCHAR(99))
INSERT #argg
SELECT value v
FROM STRING_SPLIT('one,two,three,four,five',',')
SELECT *
FROM #argg
DROP TABLE #argg
nhưng điều này thực sự dài và gây phiền nhiễu. Còn ý tưởng nào hay hơn không?
STRING_SPLIT
các phần tử trả về theo thứ tự khác với điều hiển nhiên, nhưng có lẽ với một số chuỗi dài điên rồ thì có thể. Cảm ơn.