Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL - Làm cách nào để truy vấn các trường hợp đăng ký lại trong TSQL?

Đây là phần bắt đầu:

sqlfiddle

fiddle mới

Nó nhận mỗi lượt truy cập cho mỗi UID theo thứ tự thừa nhậnDT, sau đó ghép nối mỗi lượt truy cập với lượt truy cập tiếp theo trong kết quả đó. Nếu ngày tiếp nhận hiện tại nằm trong khoảng từ ngày xuất viện cuối cùng đến 30 ngày kể từ ngày đó, hãy chọn ngày đó. Tuy nhiên, có một số điểm kỳ lạ - UID 1 được cho là đã được nhập viện vào ngày 6/12/2012 và không bao giờ được xuất viện, nhưng sau đó nhập viện lại vào ngày 20/6/2013 và xuất viện cùng ngày.

chỉnh sửa:được cấu trúc lại một chút để giảm số lượng liên kết

WITH cte AS (
  SELECT visitid,uid,dischargedt,admitdt,
    row_number()over(partition BY uid ORDER BY admitdt) AS r
  FROM t
  )
SELECT
c1.visitid AS v1, c2.visitid AS v2,
c1.uid,
c1.dischargedt as [Discharged from first visit],
c2.admitdt as [Admitted to next visit]
FROM cte c1
INNER JOIN cte c2 ON c1.uid=c2.uid
WHERE c1.visitid<>c2.visitid
AND c1.r+1=c2.r
AND c2.admitdt BETWEEN c1.dischargedt AND dateadd(d,30,c1.dischargedt )
ORDER BY c1.uid

Kết quả :

| V1 | V2 | UID | DISCHARGED FROM FIRST VISIT |      ADMITTED TO NEXT VISIT |
|----|----|-----|-----------------------------|-----------------------------|
| 25 | 38 |   2 | June, 11 2013 16:13:00+0000 | June, 12 2013 10:10:00+0000 |
| 38 | 12 |   2 | June, 12 2013 10:10:00+0000 | June, 17 2013 06:51:00+0000 |
| 18 | 34 |   3 | June, 11 2013 12:08:00+0000 | June, 12 2013 08:40:00+0000 |
| 21 | 22 |   3 | June, 12 2013 14:40:00+0000 | June, 13 2013 10:00:00+0000 |
| 22 | 16 |   3 | June, 14 2013 12:00:00+0000 | June, 19 2013 04:48:00+0000 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách sử dụng các tính năng AlwaysOn của SQL Server

  2. Đã vượt quá kích thước hàng tối đa khi sao chép trường varbinary (max)

  3. SQL SERVER 2008 NHẬN CÁC GIÁ TRỊ ĐƯỢC CHỨNG NHẬN CUỐI CÙNG

  4. SQL thay thế tất cả các NULL

  5. Làm cách nào để xóa bằng INNER JOIN với SQL Server?