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

tạo cột id dựa trên dữ liệu hoạt động

Tôi nghĩ điều này sẽ thực hiện thủ thuật:

WITH EVENTS AS (SELECT 'abc' usr, to_date('2016-01-01 08:00:00', 'yyyy-mm-dd hh24:mi:ss') event_ts, 'login' event_type FROM dual UNION ALL
                SELECT 'abc' usr, to_date('2016-01-01 08:25:00', 'yyyy-mm-dd hh24:mi:ss') event_ts, 'Stuff' event_type FROM dual UNION ALL
                SELECT 'abc' usr, to_date('2016-01-01 10:00:00', 'yyyy-mm-dd hh24:mi:ss') event_ts, 'Stuff' event_type FROM dual UNION ALL
                SELECT 'abc' usr, to_date('2016-01-01 14:00:00', 'yyyy-mm-dd hh24:mi:ss') event_ts, 'login' event_type FROM dual UNION ALL
                SELECT 'xyz' usr, to_date('2015-12-31 18:00:00', 'yyyy-mm-dd hh24:mi:ss') event_ts, 'login' event_type FROM dual UNION ALL
                SELECT 'xyz' usr, to_date('2016-01-01 08:00:00', 'yyyy-mm-dd hh24:mi:ss') event_ts, 'Logout' event_type FROM dual UNION ALL
                SELECT 'def' usr, to_date('2016-01-01 08:00:00', 'yyyy-mm-dd hh24:mi:ss') event_ts, 'Logout' event_type FROM dual UNION ALL
                SELECT 'def' usr, to_date('2016-01-01 08:15:00', 'yyyy-mm-dd hh24:mi:ss') event_ts, 'Logout' event_type FROM dual)
SELECT usr,
       event_ts,
       event_type,
       SUM(counter) OVER (PARTITION BY usr ORDER BY event_ts) session_id
FROM   (SELECT usr,
               event_ts,
               event_type,
               CASE WHEN LAG(event_type, 1, 'Logout') OVER (PARTITION BY usr ORDER BY event_ts) = 'Logout' THEN 1
                    WHEN event_type = 'Logout' THEN 0
                    WHEN event_ts - LAG(event_ts) OVER (PARTITION BY usr ORDER BY event_ts) > 1/24 THEN 1
                    WHEN event_type = 'login' THEN 1
                    ELSE 0
               END counter
        FROM   EVENTS);

USR EVENT_TS            EVENT_TYPE SESSION_ID
--- ------------------- ---------- ----------
abc 2016-01-01 08:00:00 login               1
abc 2016-01-01 08:25:00 Stuff               1
abc 2016-01-01 10:00:00 Stuff               2
abc 2016-01-01 14:00:00 login               3
def 2016-01-01 08:00:00 Logout              1
def 2016-01-01 08:15:00 Logout              2
xyz 2015-12-31 18:00:00 login               1
xyz 2016-01-01 08:00:00 Logout              1

Giải pháp này dựa trên sự ngắn mạch logic diễn ra trong biểu thức CASE và thực tế là event_type không phải là null. Nó cũng giả định rằng nhiều lần đăng xuất trong một hàng được tính là các phiên riêng biệt:

  1. Nếu hàng trước đó là hàng đăng xuất (và nếu không có hàng trước đó - tức là đối với hàng đầu tiên trong tập hợp - hãy coi nó như thể có hàng đăng xuất), chúng tôi muốn tăng bộ đếm lên một. (Đăng xuất chấm dứt phiên, vì vậy chúng tôi luôn có phiên mới sau khi đăng xuất.)
  2. Nếu hàng hiện tại là hàng đăng xuất, thì hàng này sẽ chấm dứt phiên hiện có. Do đó, không nên tăng bộ đếm.
  3. Nếu thời gian của hàng hiện tại lớn hơn hàng trước đó một giờ, hãy tăng bộ đếm lên một giờ.
  4. Nếu hàng hiện tại là hàng đăng nhập, thì đó là một phiên mới, vì vậy hãy tăng bộ đếm lên một.
  5. Đối với bất kỳ trường hợp nào khác, chúng tôi không tăng bộ đếm.

Khi chúng tôi đã hoàn thành việc đó, chỉ cần tính tổng số tiền đang chạy trên quầy.



  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ác từ khóa IS so với AS cho PL / SQL Oracle Chức năng hoặc Tạo thủ tục

  2. ORA-01704:chuỗi ký tự quá dài 'Lỗi khi chèn tài liệu XML trong kiểu cột Oracle XMLTYPE'

  3. làm thế nào để truy vấn bảng tham gia bằng cách sử dụng hibernate?

  4. tham gia ba bảng để có kết quả cụ thể

  5. Chèn CLOB vào cơ sở dữ liệu Oracle