sql >> Databáze >  >> RDS >> Sqlserver

Dotaz na nápovědu při použití tabulky auditu

Za předpokladu, že tabulka auditu také zaznamenává lease_period sloupec primárního klíče, zde odkazovaný lp_id pro jednoduchost můžete zkusit následující přístup:

  1. Najděte všechny řádky obsahující audit_type je 'Updated' .

  2. Seřaďte všechny řádky podle audit_date a jejich rozdělení podle lp_id .

  3. Seřaďte řádky podle audit_date rozdělení podle lp_id, suite_id, lease_id, building_id .

  4. Získejte rozdíl mezi těmito dvěma hodnoceními.

  5. Seřaďte řádky znovu podle audit_date , nyní je rozdělí podle lp_id, suite_id, lease_id, building_id, (ranking_difference) .

  6. Vypíše všechny řádky, kde je poslední hodnota hodnocení 2 nebo vyšší.

Výsledkem prvních čtyř kroků je sada řádků, kde každá skupina po sobě jdoucích (ve vzestupném pořadí audit_date ) řádky s identickými hodnotami suite_id, lease_id, building_id pro stejné lp_id bude jednoznačně odlišena hodnotou vypočítanou jako rozdíl mezi hodnoceními #2 a #3.

V rámci skupiny se každý řádek, počínaje druhým, bude od předchozího lišit pouze hodnotou tenant_trading_name , což je přesně to, co potřebujeme. Řádky tedy seřadíme ještě jednou, přičemž vezmeme v úvahu 'ID skupiny', které jsme právě získali, a poté vrátíme každý řádek s hodnocením 2 nebo vyšším.

Zde je přibližná implementace:

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

Poznámka. To předpokládá, že tabulka auditu zaznamenává pouze skutečné změny, tj. nemohou existovat dva po sobě jdoucí řádky se stejným primárním klíčem, kde všechny čtyři sloupce mají stejné hodnoty.



  1. Nelze otevřít test databáze požadovaný přihlášením. Přihlášení se nezdařilo. Přihlášení pro uživatele 'xyz\ASPNET' se nezdařilo

  2. Slučovací dotaz vrací ORA-30926:nelze získat stabilní sadu řádků ve zdrojových tabulkách

  3. Jak aktualizovat serializovaná data v MySQL

  4. Vyplnění pole Many2many (odoo 8)