Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Consultar ajuda ao usar a tabela de auditoria


Supondo que a tabela de auditoria também registre o lease_period coluna de chave primária, referenciada aqui lp_id para simplificar, você pode tentar a seguinte abordagem:

  1. Encontre todas as linhas em que audit_type é 'Updated' .

  2. Classifique todas as linhas por audit_date e particionando-os por lp_id .

  3. Classifique as linhas por audit_date particionamento por lp_id, suite_id, lease_id, building_id .

  4. Obtenha a diferença entre os dois rankings.

  5. Classifique as linhas novamente por audit_date , particionando-os agora por lp_id, suite_id, lease_id, building_id, (ranking_difference) .

  6. Emita todas as linhas em que o último valor de classificação é 2 ou maior.

As primeiras quatro etapas resultam em um conjunto de linhas em que cada grupo de números consecutivos (em ordem crescente de audit_date ) com valores idênticos de suite_id, lease_id, building_id para o mesmo lp_id será distinguido exclusivamente por um valor calculado como a diferença entre as classificações #2 e #3.

Dentro do grupo, cada linha, a partir da segunda, será diferente da anterior apenas no valor de tenant_trading_name , que é exatamente o que precisamos. Assim, classificamos as linhas mais uma vez, levando em consideração o 'ID do grupo' que acabamos de obter, e retornamos cada linha com a classificação 2 ou superior.

Aqui está uma implementação aproximada:
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

Observação. Isso pressupõe que a tabela de auditoria registra apenas alterações reais, ou seja, não pode haver duas linhas consecutivas com a mesma chave primária em que todas as quatro colunas tenham valores idênticos.