Skip to content
EHI Playground

Encounters and Patient Movement

Purpose: To dissect the encounter—the central organizing event in healthcare—and understand how Epic tracks every patient interaction and movement through the system, from outpatient clinics to hospital stays.

Every diagnosis, order, and clinical note connects to an encounter. It’s the fundamental organizing principle of the medical record, representing each discrete interaction between a patient and the healthcare system. Epic’s encounter model captures everything from a five-minute telehealth check-in to a month-long hospital stay.

View recent patient encounters

View SQL Query
SELECT 
    pe.PAT_ENC_CSN_ID as CSN,
    SUBSTR(pe.CONTACT_DATE, 1, 10) as Visit_Date,
    cd.DEPARTMENT_NAME as Department,
    cs.PROV_NAME as Provider,
    pe.APPT_STATUS_C_NAME as Status
FROM PAT_ENC pe
LEFT JOIN CLARITY_DEP cd ON pe.DEPARTMENT_ID = cd.DEPARTMENT_ID
LEFT JOIN CLARITY_SER cs ON pe.VISIT_PROV_ID = cs.PROV_ID
WHERE pe.PAT_ID = 'Z7004242'
ORDER BY pe.CONTACT_DATE DESC
LIMIT 10;
CSNVisit_DateDepartmentProviderStatus
8378443669/8/2020 1MAC APL INTERNAL MEDICINELOUGH, KAREN L
9912251179/28/2023 MAC APL INTERNAL MEDICINERAMMELKAMP, ZOE LCompleted
10287394689/28/2023 MAC APL INTERNAL MEDICINERAMMELKAMP, ZOE L
10287437019/28/2023 MAC APL LABORATORYMAC LAB APLCompleted
10287663539/28/2023 MAC APL INTERNAL MEDICINERAMMELKAMP, ZOE L
7871373469/28/2019 NULLNULL
10286065599/27/2023 NULLNULL
10278632299/25/2023 NULLNULL
9626031109/25/2022 NULLNULL
8987946749/25/2021 NULLNULL

Each row represents a unique patient interaction, identified by the Contact Serial Number (CSN).

Understanding the CSN (Contact Serial Number)

Section titled “Understanding the CSN (Contact Serial Number)”

The PAT_ENC_CSN_ID is Epic’s unique identifier for every patient interaction. It serves as the universal foreign key linking all encounter-related data.

Verify CSN uniqueness and its role as a primary key

View SQL Query
SELECT 
    COUNT(*) as total_encounters,
    COUNT(DISTINCT PAT_ENC_CSN_ID) as unique_csns,
    CASE 
        WHEN COUNT(*) = COUNT(DISTINCT PAT_ENC_CSN_ID) 
        THEN 'CSNs are unique (primary key)' 
        ELSE 'CSNs are not unique' 
    END as verification
FROM PAT_ENC;
total_encountersunique_csnsverification
111111CSNs are unique (primary key)

When multiple encounters occur on the same day, how do you maintain chronological order? Epic’s elegant solution uses decimal sequencing.

Demonstrate the decimal date pattern for chronological sorting

View SQL Query
SELECT 
    PAT_ID,
    CONTACT_DATE,
    PAT_ENC_DATE_REAL,
    -- Extract the sequence number
    ROUND((PAT_ENC_DATE_REAL - CAST(PAT_ENC_DATE_REAL AS INT)) * 100, 0) + 1 as encounter_sequence
FROM PAT_ENC
WHERE CONTACT_DATE = '9/28/2023 12:00:00 AM'
ORDER BY PAT_ENC_DATE_REAL;
PAT_IDCONTACT_DATEPAT_ENC_DATE_REALencounter_sequence
Z70042429/28/2023 12:00:00 AM667451
Z70042429/28/2023 12:00:00 AM66745.012
Z70042429/28/2023 12:00:00 AM66745.023
Z70042429/28/2023 12:00:00 AM66745.034

The decimal portion (0.00, 0.01, 0.02…) provides unique sequencing for same-day encounters, guaranteeing a correct timeline.

Encounters occur in various settings, which can often be identified by the department name or specific encounter type fields.

Analyze encounter types across different departments

View SQL Query
SELECT 
    cd.DEPARTMENT_NAME as Department,
    COUNT(*) as Count,
    MIN(SUBSTR(pe.CONTACT_DATE, 1, 10)) as First_Visit,
    MAX(SUBSTR(pe.CONTACT_DATE, 1, 10)) as Last_Visit
FROM PAT_ENC pe
LEFT JOIN CLARITY_DEP cd ON pe.DEPARTMENT_ID = cd.DEPARTMENT_ID
WHERE pe.PAT_ID = 'Z7004242'
GROUP BY cd.DEPARTMENT_NAME
ORDER BY Count DESC;
DepartmentCountFirst_VisitLast_Visit
NULL661/25/2019 9/28/2019
MAC APL INTERNAL MEDICINE331/9/2020 19/8/2020 1
MAC APL LABORATORY510/11/20229/28/2023
MHM OT NEURO CENTRAL23/11/2022 3/22/2022
GENERIC EXTERNAL DATA DEPARTMENT23/11/2022 9/21/2020
MHM CENTRAL SCHEDULING12/9/2022 12/9/2022 1
MCM W WASH PEDS12/1/2019 12/1/2019 1
MAC APL BUSINESS SERVICES18/9/2018 18/9/2018 1

For inpatient stays, PAT_ENC and the related PAT_ENC_HSP table track admission and discharge details.

View hospital admissions and length of stay

View SQL Query
SELECT 
    pe.PAT_ENC_CSN_ID as CSN,
    SUBSTR(pe.HOSP_ADMSN_TIME, 1, 10) as Admission_Date,
    SUBSTR(pe.HOSP_DISCHRG_TIME, 1, 10) as Discharge_Date,
    pe.HOSP_ADMSN_TYPE_C_NAME as Admission_Type,
    hsp.DISCH_DISP_C_NAME as Discharge_Disposition,
    CASE 
        WHEN pe.HOSP_ADMSN_TIME IS NOT NULL AND pe.HOSP_DISCHRG_TIME IS NOT NULL
        THEN ROUND(julianday(pe.HOSP_DISCHRG_TIME) - julianday(pe.HOSP_ADMSN_TIME), 2)
        ELSE NULL
    END as los_days
FROM PAT_ENC pe
LEFT JOIN PAT_ENC_HSP hsp ON pe.PAT_ENC_CSN_ID = hsp.PAT_ENC_CSN_ID
WHERE pe.PAT_ID = 'Z7004242'
  AND pe.HOSP_ADMSN_TIME IS NOT NULL
ORDER BY pe.HOSP_ADMSN_TIME DESC;
CSNAdmission_DateDischarge_DateAdmission_TypeDischarge_Dispositionlos_days
9229431123/22/2022 3/22/2022 ElectiveHome - Discharge to Home or Self CareNULL
9229426743/11/2022 3/11/2022 ElectiveHome - Discharge to Home or Self CareNULL
720803470ElectiveNULLNULL
724619887NULLNULL
724623985NULLNULL
724628999ElectiveNULLNULL
725327197ElectiveNULLNULL
727947624NULLNULL
736485409NULLNULL
740764099NULLNULL
745238411NULLNULL
749745972NULLNULL
750474644NULLNULL
754166145NULLNULL
758599939NULLNULL
763443168NULLNULL
768007053NULLNULL
772693619NULLNULL
777174829NULLNULL
781842097NULLNULL
787137346NULLNULL
791983409NULLNULL
797089043NULLNULL
799951565ElectiveNULLNULL
802802103NULLNULL
827277205NULLNULL
829212157ElectiveNULLNULL
829213099ElectiveNULLNULL
829273579NULLNULL
829282937NULLNULL
829385742NULLNULL
829393933NULLNULL
829467718NULLNULL
829995922NULLNULL
829996120NULLNULL
830043848NULLNULL
830047706NULLNULL
831452662NULLNULL
832464108NULLNULL
833901305NULLNULL
836036457NULLNULL
837844366NULLNULL
839256727NULLNULL
840888730NULLNULL
845590414NULLNULL
850593484NULLNULL
854992547NULLNULL
859392791NULLNULL
864389217NULLNULL
869002878NULLNULL
873928397NULLNULL
878774242NULLNULL
883637721NULLNULL
888227767NULLNULL
893473416NULLNULL
898794674NULLNULL
921952141ElectiveNULLNULL
922943525NULLNULL
924936761NULLNULL
927098738NULLNULL
927200229NULLNULL
928532643NULLNULL
930010268NULLNULL
935515793NULLNULL
940919045NULLNULL
946189306NULLNULL
948002801ElectiveNULLNULL
948004323ElectiveNULLNULL
951207510NULLNULL
957265560NULLNULL
957995289NULLNULL
958134730NULLNULL
958147754ElectiveNULLNULL
958148226ElectiveNULLNULL
958148810ElectiveNULLNULL
962603110NULLNULL
968143108NULLNULL
973908013NULLNULL
974452422NULLNULL
974614965ElectiveNULLNULL
974974125NULLNULL
977858467NULLNULL
979218048NULLNULL
984606712NULLNULL
988126821NULLNULL
990151874NULLNULL
991215738NULLNULL
991221485NULLNULL
991225117ElectiveNULLNULL
995315871NULLNULL
996534320NULLNULL
1000825434NULLNULL
1006342664NULLNULL
1011533066NULLNULL
1016759309NULLNULL
1018439080NULLNULL
1020583168NULLNULL
1022460205NULLNULL
1027863229NULLNULL
1028606559NULLNULL

The ADT Event Trail: Tracking Patient Movement

Section titled “The ADT Event Trail: Tracking Patient Movement”

The CLARITY_ADT table provides a detailed audit trail of patient movement (Admission, Discharge, Transfer) within a facility.

Show the complete patient journey for an encounter

View SQL Query
SELECT 
    EVENT_TYPE_C_NAME,
    EFFECTIVE_TIME,
    -- Calculate time between events
    ROUND((julianday(EFFECTIVE_TIME) - 
           julianday(LAG(EFFECTIVE_TIME) OVER (ORDER BY EFFECTIVE_TIME))) * 24, 2) as hours_since_last_event
FROM CLARITY_ADT
WHERE PAT_ENC_CSN_ID = 922942674
ORDER BY EFFECTIVE_TIME;
EVENT_TYPE_C_NAMEEFFECTIVE_TIMEhours_since_last_event
Discharge3/11/2022 11:59:00 PMNULL
Hospital Outpatient3/11/2022 2:41:00 PMNULL

The APPT_STATUS_C_NAME field tracks the workflow of scheduled appointments.

Analyze appointment status distribution

View SQL Query
SELECT 
    APPT_STATUS_C_NAME,
    COUNT(*) as count,
    ROUND(100.0 * COUNT(*) / (SELECT COUNT(*) FROM PAT_ENC), 1) as percentage
FROM PAT_ENC
GROUP BY APPT_STATUS_C_NAME
ORDER BY count DESC;
APPT_STATUS_C_NAMEcountpercentage
9484.7
Completed1311.7
Canceled32.7
Scheduled10.9

Note that many encounters (especially non-scheduled or inpatient) may have a NULL status.

Epic tracks multiple provider relationships for each encounter.

Understand the different provider roles

View SQL Query
SELECT 
    pe.PAT_ENC_CSN_ID,
    vp.PROV_NAME as Visit_Provider,
    pcp.PROV_NAME as PCP_on_Visit,
    pe.REFERRAL_SOURCE_ID_REFERRING_PROV_NAM as Referring_Provider
FROM PAT_ENC pe
LEFT JOIN CLARITY_SER vp ON pe.VISIT_PROV_ID = vp.PROV_ID
LEFT JOIN CLARITY_SER pcp ON pe.PCP_PROV_ID = pcp.PROV_ID
WHERE pe.PAT_ID = 'Z7004242' AND pe.APPT_STATUS_C_NAME = 'Completed'
LIMIT 5;
PAT_ENC_CSN_IDVisit_ProviderPCP_on_VisitReferring_Provider
720803470DHILLON, PUNEET SDHILLON, PUNEET SDHILLON, PUNEET S
724628999MAC LAB APLDHILLON, PUNEET SDHILLON, PUNEET S
725327197MAC LAB APLDHILLON, PUNEET SDHILLON, PUNEET S
799951565DHILLON, PUNEET SDHILLON, PUNEET SDHILLON, PUNEET S
829213099PICONE, MARY ADHILLON, PUNEET S
  • Visit Provider: The provider who saw the patient.
  • PCP: The patient’s primary care provider at the time of the visit.
  • Referring Provider: The provider who sent the patient for the visit.

To understand a patient’s care journey, you can construct a chronological timeline of their visits.

Create a patient's encounter timeline

View SQL Query
WITH encounter_timeline AS (
    SELECT 
        pe.PAT_ENC_CSN_ID,
        pe.CONTACT_DATE,
        pe.PAT_ENC_DATE_REAL,
        pe.APPT_STATUS_C_NAME,
        cd.DEPARTMENT_NAME,
        cs.PROV_NAME as Visit_Provider,
        -- Calculate days since last encounter
        ROUND(pe.PAT_ENC_DATE_REAL - LAG(pe.PAT_ENC_DATE_REAL) OVER (
            PARTITION BY pe.PAT_ID 
            ORDER BY pe.PAT_ENC_DATE_REAL
        ), 0) as days_since_last_visit
    FROM PAT_ENC pe
    LEFT JOIN CLARITY_DEP cd ON pe.DEPARTMENT_ID = cd.DEPARTMENT_ID
    LEFT JOIN CLARITY_SER cs ON pe.VISIT_PROV_ID = cs.PROV_ID
    WHERE pe.PAT_ID = 'Z7004242'
)
SELECT * FROM encounter_timeline
ORDER BY PAT_ENC_DATE_REAL
LIMIT 10;
PAT_ENC_CSN_IDCONTACT_DATEPAT_ENC_DATE_REALAPPT_STATUS_C_NAMEDEPARTMENT_NAMEVisit_Providerdays_since_last_visit
7208034708/9/2018 12:00:00 AM64869CompletedMAC APL INTERNAL MEDICINEDHILLON, PUNEET SNULL
7246198878/9/2018 12:00:00 AM64869.01MAC APL BUSINESS SERVICESDHILLON, PUNEET S0
7246239858/9/2018 12:00:00 AM64869.02MAC APL INTERNAL MEDICINEDHILLON, PUNEET S0
7246289998/9/2018 12:00:00 AM64869.03CompletedMAC APL LABORATORYMAC LAB APL0
7253271978/18/2018 12:00:00 AM64878CompletedMAC APL LABORATORYMAC LAB APL9
7279476248/28/2018 12:00:00 AM64888MAC APL INTERNAL MEDICINEWILD, DAWN M10
73648540910/25/2018 12:00:00 AM64946NULLNULL58
74076409911/25/2018 12:00:00 AM64977NULLNULL31
74523841112/25/2018 12:00:00 AM65007NULLNULL30
7497459721/25/2019 12:00:00 AM65038NULLNULL31

  • PAT_ENC is the master encounter table, with PAT_ENC_CSN_ID as the unique identifier for every interaction.
  • PAT_ENC_DATE_REAL uses decimal sequencing to ensure unique and reliable chronological ordering.
  • Encounters span all care settings, from outpatient appointments to inpatient hospital stays and ED visits.
  • CLARITY_ADT provides a granular audit trail of patient movement during an admission.
  • Multiple provider roles (Visit, PCP, Referring) are tracked for each encounter.
  • Encounter types can be inferred from department names and admission type fields since this extract lacks a dedicated encounter type column.