sql >> Databasteknik >  >> RDS >> Sqlserver

Få all kraft in och ut för varje anställd?

Du kan använda en subselect eller CTE för att få uppgifterna beställda av anställda och använda den som huvuddatatabell. Något liknande (anpassa det vid behov) till detta:

;with ordered as (
select 
    emp_reader_id as empId,
    CONVERT(DATE, dt) as Punch,
    Row_number()
     OVER (PARTITION BY emp_reader_id ORDER BY CONVERT(DATE, dt) ASC) as OrderedPunch
from trnevents
)
SELECT 
    entered.empId, 
    entered.Punch as PunchIn,
    exited.Punch as PunchOut
from
    ordered as entered
    left join ordered as exited on 
        entered.empId = exited.empId
        and entered.OrderedPunch + 1 = exited.OrderedPunch

Förklaring:Den "beställda" CTE visar personalens in-/utträde ordnade efter datum. ROW_NUMBER återställs för varje anställd (jag antar att emp_reader_id innehåller anställd-id) på grund av PARTITION BY .

När jag väl fått räknaren för varje anställd slår jag ihop varje stämpel för varje anställd (första villkoret i den vänstra kopplingen) med nästa stämpling för den anställde (andra villkoret i den vänstra kopplingen). På så sätt kan jag visa ingångskolumnen och utgången (nästa slag).

Efter att du fått in- och utkolumnerna i dina data kanske du vill utesluta vissa data (de udda raderna för varje anställd är de rader du vill ha) och lägga till WHERE entered.OrderedPunch %2 = 1




  1. 5 Fördelar med proaktiv övervakning av databasprestanda

  2. Hur lagrar man en pandas dataram med dataobjekt av typen datetime.timedelta i en postgresql d/b med hjälp av sqlalchemy?

  3. Använda Oracle® Heterogeneous Services med två ODBC-datakällor

  4. Flera infoga SQL-oracle