Как получить данные из SQL Server на основе приведенного ниже примера? - PullRequest
0 голосов
/ 26 июня 2018

На самом деле я разместил похожий вопрос, связанный с этим, здесь Как получить данные из SQL Server, как требуется ниже? , и теперь мне потребовались некоторые изменения, поэтому, пожалуйста, ознакомьтесь с этим, прежде чем предлагать

У меня есть такая таблица:

 CustName    Country    RecordedTime
 ---------------------------------------------
  Alex        Australia  2018-Jun-01 08:00 AM
  Alex        China      2018-Jun-01 10:00 AM
  Alex        Japan      2018-Jun-01 11:00 AM
  John        Australia  2018-Jun-01 08:00 AM
  John        China      2018-Jun-02 08:00 AM
  Bob         Australia  2018-Jun-02 09:00 AM
  Bob         Brazil     2018-Jun-03 09:50 AM
  Bob         Africa     2018-Jun-03 11:50 AM
  Bob         India      2018-Jun-03 12:55 AM

Если создается новая запись и эта запись изменяется несколько раз в один и тот же день, то выводится как первая и последняя из измененных записей, а если существующая запись изменяется несколько раз в один и тот же день, вывод должен быть до первого изменение и текущее изменение

например: если указать дату ввода как 2018-июнь-01, то результат должен быть таким, как показано ниже;

CustName    Country    RecordedTime           Audit    History
  ----------------------------------------------------------------
   Alex        Australia  2018-Jun-01 08:00 AM   ADD      NEW
   Alex        Japan      2018-Jun-01 11:00 AM   CHANGE   CURRENT
   John        Australia  2018-Jun-01 08:00 AM   ADD      NEW

Если указать дату ввода как 2018-июнь-02, то результат должен быть таким, как показано ниже;

   CustName    Country    RecordedTime           Audit    History
  -----------------------------------------------------------------
   John        Australia  2018-Jun-01 08:00 AM   CHANGE   BEFORE
   John        China      2018-Jun-02 08:00 AM   CHANGE   CURRENT
   Bob         Australia  2018-Jun-02 09:00 AM   ADD      NEW

Если указать дату ввода как 2018-июнь-03, то результат должен быть таким, как показано ниже;

   CustName    Country    RecordedTime           Audit    History
  ----------------------------------------------------------------
   Bob         Australia  2018-Jun-02 09:00 AM   CHANGE   BEFORE
   Bob         India      2018-Jun-03 12:55 AM   CHANGE   CURRENT

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 26 июня 2018

Может быть, вы можете использовать решение, как показано ниже См. Рабочую демонстрацию

declare @d date='2018-Jun-03'

; with Indexer as 
(
    select 
        *, 
        rn= row_number() over(partition by CustName order by RecordedTime),
        rn2=row_number() over(partition by CustName order by RecordedTime desc)
    from records
)
,GetValidCustomerRecords as
(
    select 
        CustName,
        Country,
        RecordedTime,
        Audit   = case when cast(RecordedTime as date)=@d and rn=1 then 'add' else 'change' end,
        History = case 
                    when cast(RecordedTime as date)=@d and rn=1 
                    then 'new' 
                    when cast(RecordedTime as date)<@d and rn=1 
                    then 'before'
                    else 'current' end
    from Indexer i 
    where CustName in
    (
    select 
        distinct CustName 
    from records
    where cast(RecordedTime as date)=@d
    ) 
    and (rn=1 or rn2=1) and cast(RecordedTime as date)<=@d
)

select * from GetValidCustomerRecords
order by CustName, RecordedTime
...