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

Sử dụng kết nối bên trong để xác định khoảng thời gian giữa các bản ghi cụ thể và các sự kiện liên quan trong một bảng

Giả sử việc chuyển giao hoặc giải ngũ là một sự kiện duy nhất mà bạn có thể viết như vậy

SELECT
   b.EventTime - a.EventTime        
FROM
   Histories a
   INNER JOIN Histories b
   ON a.VisitID = b.VisitID
WHERE
   a.event = 'Admission'
   and
   b.event in ('Transfer', 'Discharge')

Nếu bạn quan tâm đến lần chuyển nhượng hoặc giải ngũ cuối cùng, bạn sẽ viết thư

SELECT
   b.EventTime - a.EventTime        
FROM
   Histories a
   INNER JOIN  Histories b
    ON a.VisitID = b.VisitID

   INNER JOIN 
   (SELECT
         VisitId, 
         MAX(HistoryID) HistoryID
    FROM Histories 
    WHERE 
       b.event in ('Transfer', 'Discharge')
    GROUP BY 
       VisitId) maxHistory
   ON b.HistoryID = maxHistoryId.HistoryId

WHERE
   a.event = 'Admission'

Tuy nhiên, nếu một Lượt truy cập có thể dẫn đến nhiều lượt truy cập như Andriy M đề cập rằng bạn có vấn đề về Khoảng cách và các đảo (cụ thể là các đảo)

Trong trường hợp đó, bạn muốn những thứ sau

SELECT  
       a.VisitId,
       a.Event a_Event, 
       a.Event b_Event, 
       a.EventTime a_EventTime,
       b.EventTime b_EventTime,
       b_EventTime - a_EventTime

FROM   histories a 
       INNER JOIN histories B 
         ON a.visitID = b.visitID 
            AND a.EventTime < b.eventTime 
       INNER JOIN (SELECT a.VisitId, 
                          a.EventTime      a_EventTime, 
                          Min(b.EventTime) b_EventTime 
                   FROM   histories a 
                          INNER JOIN histories B 
                            ON a.visitID = b.visitID 
                               AND a.EventTime < b.eventTime 
                   GROUP  BY a_EventTime, 
                             a.VisitId) MinTime 
         ON a.VisitID = MinTime.VisitID 
            AND a.EventTime = a_EventTime 
            AND b.EventTime = b_EventTime 

DEMO

Sử dụng dữ liệu mẫu sau

CREATE TABLE Histories 
    (
     HistoryId int auto_increment primary key, 
     VisitId int,
     Location varchar(20),
     Event varchar(20), 
     EventTime datetime
    );

INSERT INTO Histories
(VisitId, Location, Event, EventTime)
VALUES
(1, 'A', 'Admission', '2012-01-01'),
(1, 'A', 'Discharge', '2012-01-03'),
(2, 'B', 'Admission', '2012-01-02'),
(2, 'C', 'Transfer', '2012-01-05'),
(2, 'C', 'Discharge', '2012-01-06'),
(3, 'D', 'Admission', '2012-01-06'),
(3, 'E', 'Transfer', '2012-01-07'),
(3, 'F', 'Transfer', '2012-01-08'),
(3, 'F', 'Discharge', '2012-01-10');

Bạn nhận được kết quả sau

VISITID    A_EVENT   B_EVENT    A_EVENTTIME                     B_EVENTTIME                     B_EVENTTIME - A_EVENTTIME
1          Admission Discharge  January, 01 2012 00:00:00-0800  January, 03 2012 00:00:00-0800  2000000
2          Admission Transfer   January, 02 2012 00:00:00-0800  January, 05 2012 00:00:00-0800  3000000
2          Transfer  Discharge  January, 05 2012 00:00:00-0800  January, 06 2012 00:00:00-0800  1000000
3          Admission Transfer   January, 06 2012 00:00:00-0800  January, 07 2012 00:00:00-0800  1000000
3          Transfer  Transfer   January, 07 2012 00:00:00-0800  January, 08 2012 00:00:00-0800  1000000
3          Transfer  Discharge  January, 08 2012 00:00:00-0800  January, 10 2012 00:00:00-0800  2000000

Ghi chú:

  • Điều này giả định rằng bạn không quan tâm đến Tuyển sinh / Bộ truyền chưa có đợt chuyển / chuyển tương ứng.
  • Nếu bạn biết rằng thời gian sự kiện không thay đổi sau khi bản ghi được nhập, bạn có thể sử dụng historyID thay vì thời gian sự kiện để xác định thứ tự của các sự kiện.
  • Bạn biết cách nhận chênh lệch Thời gian Sự kiện ở định dạng bạn thích


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn dữ liệu vào cơ sở dữ liệu mysql từ xa bằng phương pháp POST từ thiết bị iOS

  2. truy vấn sql để chọn bản ghi có cùng id nhưng khác giá trị trong hai cột

  3. tìm kiếm mã trong servlet để mysql?

  4. Cách thay đổi số thứ tự bắt đầu trong Magento

  5. Trong MySQL, tôi có nên trích dẫn số hay không?