Làm thế nào về (và hãy đảm bảo rằng câu lệnh trước đó kết thúc bằng dấu chấm phẩy):
WITH numberedrows
AS (SELECT ROW_NUMBER() OVER (PARTITION BY UserID
ORDER BY CreationDate)
- DATEDIFF(day,'19000101',CreationDate) AS TheOffset,
CreationDate,
UserID
FROM tablename)
SELECT MIN(CreationDate),
MAX(CreationDate),
COUNT(*) AS NumConsecutiveDays,
UserID
FROM numberedrows
GROUP BY UserID,
TheOffset
Ý tưởng là nếu chúng ta có danh sách ngày (dưới dạng số) và row_number, thì những ngày bị bỏ lỡ sẽ làm cho sự chênh lệch giữa hai danh sách này lớn hơn một chút. Vì vậy, chúng tôi đang tìm kiếm một phạm vi có mức bù nhất quán.
Bạn có thể sử dụng "ORDER BY NumConsearchDays DESC" ở cuối phần này hoặc nói "HAVING count (*)> 14" cho một ngưỡng ...
Tuy nhiên, tôi chưa thử nghiệm điều này - chỉ viết nó ra khỏi đỉnh đầu của tôi. Hy vọng hoạt động trong SQL2005 trở đi.
... và sẽ được giúp đỡ rất nhiều bởi một chỉ mục trên tên bảng (UserID, CreationDate)
Đã chỉnh sửa:Hóa ra Offset là một từ dành riêng, vì vậy tôi đã sử dụng TheOffset để thay thế.
Đã chỉnh sửa:Đề xuất sử dụng COUNT (*) rất hợp lệ - Tôi nên làm điều đó ngay từ đầu nhưng không thực sự nghĩ. Trước đây, nó đã sử dụng dateiff (ngày, tối thiểu (Ngày tạo), tối đa (Ngày tạo)) thay thế.
Cướp