Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Помощ за заявка при използване на таблица за проверка

Ако приемем, че таблицата за проверка регистрира и lease_period колона с първичен ключ, посочена тук lp_id за простота можете да опитате следния подход:

  1. Намерете всички редове, където audit_type е 'Updated' .

  2. Класирайте всички редове по audit_date и разделянето им чрез lp_id .

  3. Класирайте редовете по audit_date разделяне по lp_id, suite_id, lease_id, building_id .

  4. Получете разликата между двете класации.

  5. Класирайте отново редовете по audit_date , разделяйки ги сега по lp_id, suite_id, lease_id, building_id, (ranking_difference) .

  6. Изведете всички редове, където последната класирана стойност е 2 или по-голяма.

Първите четири стъпки водят до набор от редове, където всяка група от последователни (във възходящ ред на audit_date ) редове с еднакви стойности на suite_id, lease_id, building_id за същия lp_id ще се отличава по уникален начин със стойност, изчислена като разлика между класирането #2 и #3.

В рамките на групата всеки ред, започвайки от втория, ще се различава от предходния само по стойността на tenant_trading_name , което е точно това, от което се нуждаем. И така, ние класираме редовете още веднъж, като вземаме предвид „ID на групата“, който току-що получихме, след което връщаме всеки ред с класиране 2 или по-високо.

Ето едно приблизително внедряване:

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

Забележка. Това предполага, че таблицата за проверка регистрира само реални промени, т.е. не може да има два последователни реда с един и същ първичен ключ, където и четирите колони имат идентични стойности.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв е препоръчителният размер на партидата за SqlBulkCopy?

  2. Различни начини за наблюдение на групите за наличност на SQL Server AlwaysOn

  3. Отмяна с име на колона

  4. Как да изпълните тригер само когато се актуализира конкретна колона (SQL сървър)

  5. Как работи IIF() в SQL Server