Какой синтаксис для вычисления времени на основе строк является SQL? - PullRequest
0 голосов
/ 19 декабря 2018

Я довольно новичок в T-SQL.Я могу получить желаемый результат, используя Excel, но это отнимает много времени (или невозможно) для больших наборов данных и подвержено ошибкам.Мне нужна помощь, чтобы написать синтаксис T-SQL для следующего повествования:

  1. Если столбец MSISDN расположен в порядке возрастания,
  2. для каждого идентичного значения MSISDN, при условии, что значение встолбец TransactionKey равен «BUNDLE»,
  3. пусть CulcExpirationDate (что означает создание нового столбца с именем «CulcExpirationDate»),
  4. для самого раннего значения TransactionTime, пусть последующее значение TransactionTime в TransactionTimeстолбец будет значением CulcExpirationDate,
  5. при условии, что он меньше значения в соответствующем столбце NewExpirationDate,
  6. в противном случае сохранит значение столбца NewExpirationDate.

Для примера таблицы данных, пожалуйста, перейдите по ссылке: https://rextester.com/BLZVD95238

Ниже приведен скриншот желаемого результата

1 Ответ

0 голосов
/ 20 декабря 2018

Так что в вашем посте есть какой-то запутанный язык.Вы говорите: «Повторите шаги 4, 5 и 6 для каждой строки с одинаковым значением MSISDN».это может означать, что каждая строка должна иметь CulcExpirationDate, но в вашем примере вы заполнили только одно.

Вы также выделили значения MSISDN, которые, как вы сказали, были идентичными, но вы включили как 248, так и 258.

Я пытался найти решение, основанное на вашей информации, используя фиктивную таблицу с ограниченным набором того, что вы указали на своем изображении.Вы можете видеть, что записи с самыми ранними значениями TransactionTime для MSISDN 248 и 258 были заполнены значением CulcExpirationDate, соответствующим следующему значению TransactionTime для соответствующего MSISDN.Все остальные значения равны NULL.

Проверьте здесь: https://rextester.com/IPQ11749

Example results

CREATE TABLE rowBasedTimeCalc
(
    MSISDN INT
    ,TransactionTime DATETIME
    ,TransactionKey CHAR(50)
    ,Reference CHAR(50)
    ,NewExpirationDate DATETIME
)

INSERT INTO dbo.rowBasedTimeCalc
VALUES
(248, CONVERT(DATETIME,'28/10/2018 02:45:43',103), 'Bundle', 'DATA1GB',convert(DATETIME,'07/11/2018 02:45:43',103)),
(248, convert(DATETIME,'08/10/2018 07:58:23',103), 'Bundle', 'DATA1GB',convert(DATETIME,'28/10/2018 06:58:23',103)),
(258, convert(DATETIME,'08/10/2018 12:39:28',103), 'Bundle', 'DATA1GB',convert(DATETIME,'18/10/2018 12:39:28',103)),
(258, convert(DATETIME,'13/10/2018 06:05:44',103), 'Bundle', 'DATA1GB',convert(DATETIME,'23/10/2018 06:05:44',103)),
(258, convert(DATETIME,'28/09/2018 17:35:00',103), 'Bundle', 'DATA1GB',convert(DATETIME,'08/10/2018 17:35:00',103)),
(258, convert(DATETIME,'19/10/2018 00:27:24',103), 'Bundle', 'DATA1GB',convert(DATETIME,'28/10/2018 23:27:24',103)),
(258, convert(DATETIME,'28/10/2018 11:35:16',103), 'Bundle', 'DATA1GB',convert(DATETIME,'07/11/2018 11:35:16',103)),
(258, convert(DATETIME,'11/10/2018 00:37:43',103), 'Bundle', 'DATA1GB',convert(DATETIME,'21/10/2018 00:37:43',103)),
(258, convert(DATETIME,'04/10/2018 23:46:28',103), 'Bundle', 'DATA1GB',convert(DATETIME,'14/10/2018 23:46:28',103)),
(258, convert(DATETIME,'25/10/2018 04:04:35',103), 'Bundle', 'DATA1GB',convert(DATETIME,'04/11/2018 03:04:35',103)),
(258, convert(DATETIME,'03/10/2018 01:19:39',103), 'Bundle', 'DATA1GB',convert(DATETIME,'13/10/2018 01:19:39',103)),
(258, convert(DATETIME,'25/09/2018 01:54:13',103), 'Bundle', 'DATA1GB',convert(DATETIME,'05/10/2018 01:54:13',103)),
(258, convert(DATETIME,'22/10/2018 22:09:29',103), 'Bundle', 'DATA1GB',convert(DATETIME,'01/11/2018 22:09:29',103));

WITH dateFinder AS
(
SELECT 
    *
    ,rowID = ROW_NUMBER() OVER (PARTITION BY MSISDN ORDER BY TransactionTime)
    ,culc = lead(transactiontime) over (PARTITION BY MSISDN ORDER BY TransactionTime)
FROM dbo.rowBasedTimeCalc
WHERE TransactionKey = 'Bundle'
)

SELECT 
    dateFinder.MSISDN
    ,dateFinder.TransactionTime 
    ,dateFinder.TransactionKey
    ,dateFinder.Reference
    ,dateFinder.NewExpirationDate
    ,CulcExpirationDate = 
        CASE 
            WHEN dateFinder.rowID = 1 AND culc < dateFinder.NewExpirationDate THEN dateFinder.culc
            ELSE NULL
        END 
FROM dateFinder

DROP TABLE dbo.rowBasedTimeCalc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...