sql >> Database >  >> RDS >> Sqlserver

Vraag hulp bij het gebruik van de controletabel

Ervan uitgaande dat de audittabel ook de lease_period registreert kolom primaire sleutel, waarnaar hier wordt verwezen lp_id voor de eenvoud kunt u de volgende aanpak proberen:

  1. Zoek alle rijen waar audit_type is 'Updated' .

  2. Rangschik alle rijen op audit_date en ze te partitioneren door lp_id .

  3. Rangschik de rijen op audit_date partitionering door lp_id, suite_id, lease_id, building_id .

  4. Ontdek het verschil tussen de twee ranglijsten.

  5. Rangschik de rijen opnieuw op audit_date , verdeel ze nu door lp_id, suite_id, lease_id, building_id, (ranking_difference) .

  6. Voer alle rijen uit waarvan de laatste rangschikking 2 of hoger is.

De eerste vier stappen resulteren in een reeks rijen waarin elke groep opeenvolgende (in oplopende volgorde van audit_date ) rijen met identieke waarden van suite_id, lease_id, building_id voor dezelfde lp_id zal uniek worden onderscheiden door een waarde die wordt berekend als het verschil tussen de rangschikkingen #2 en #3.

Binnen de groep zal elke rij, beginnend bij de tweede, alleen verschillen van de vorige in de waarde van tenant_trading_name , dat is precies wat we nodig hebben. We rangschikken de rijen dus opnieuw, rekening houdend met de 'groeps-ID' die we zojuist hebben verkregen, en retourneren elke rij met de rangorde van 2 of hoger.

Hier is een geschatte implementatie:

WITH marked AS (
  SELECT
    *,
    grp = ROW_NUMBER() OVER (PARTITION BY lp_id
                                 ORDER BY audit_date)
        - ROW_NUMBER() OVER (PARTITION BY lp_id, suite_id, lease_id, building_id
                                 ORDER BY audit_date)
  FROM lease_period_audit
  WHERE audit_type = 'Updated'
),
ranked AS (
  SELECT
    *,
    rnk = ROW_NUMBER() OVER (PARTITION BY lp_id, suite_id, lease_id, building_id, grp
                                 ORDER BY audit_date)
  FROM marked
)
SELECT
  audit_date,
  lp_id,
  tenant_trading_name,
  suite_id,
  lease_id,
  building_id
FROM ranked
WHERE rnk = 2

Opmerking. Dit veronderstelt dat de controletabel alleen echte wijzigingen registreert, d.w.z. er kunnen geen twee opeenvolgende rijen zijn met dezelfde primaire sleutel waarbij alle vier de kolommen identieke waarden hebben.



  1. kan de retourwaarde van de instructie execute niet opslaan in mysql

  2. Welke modus voor MySQL WEEK() voldoet aan ISO 8601

  3. % teken in Java's PreparedStatement

  4. MS SQL Server laatst ingevoerde ID