sql >> Database >  >> RDS >> Sqlserver

Krijgen alle punch in en uit voor elke werknemer?

U kunt een subselectie of CTE gebruiken om de gegevens per werknemer te bestellen en deze als hoofdgegevenstabel te gebruiken. Iets soortgelijks (pas het indien nodig aan) hierop:

;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

Toelichting:De 'bestelde' CTE toont wel de in- en uitstroom van de werknemer geordend op datum. De ROW_NUMBER wordt gereset voor elke werknemer (ik neem aan dat de emp_reader_id de werknemer-ID bevat) vanwege de PARTITION BY .

Zodra ik de teller voor elke werknemer heb, voeg ik elke stoot voor elke werknemer (eerste voorwaarde in de linker join) toe aan de volgende stoot voor die werknemer (tweede voorwaarde in de linker join). Op die manier kan ik de ingangskolom en de uitgang (de volgende stoot) laten zien.

Nadat u de in- en uitkolommen in uw gegevens hebt gekregen, wilt u misschien enkele gegevens uitsluiten (de oneven rijen van elke werknemer zijn de rijen die u zou willen) door WHERE entered.OrderedPunch %2 = 1 toe te voegen




  1. Het invoegen van gegevens van CSV in MySQL DB is erg traag

  2. SQL Transponeer rijen als kolommen

  3. Kies uit meerdere tabellen met laravel vloeiende querybuilder

  4. PGPASSWORD-omgevingsvariabele instellen voor Postgres (psql)-proces uitgevoerd door Inno Setup