2014-12-09 5 views
0

Я хочу удалить/проигнорировать/разделить журналы, которые полезны из журналов, которые не являются полезными. Журналы, которые полезны, встречаются до или во время, которое известно flag. Журналы, которые не являются полезными, появляются после первого помеченного журнала.Разделение строк данных на основе флага и метки времени

Данные выглядят следующим образом. Каждый UID видел во время t:

UID  t  flag  PCP 
'0000' 1  0   0 
'0000' 2  1   0 
'0000' 3  1   0 
'0000' 4  0   0 
'1111' 11  1   0 
'1111' 12  0   0 
'1111' 13  0   0 
'2222' 1  0   0 
'2222' 2  0   0 
'2222' 3  0   0 

Есть ли запрос на ввод значение 0/1 в PCP, так что я могу получить

UID  t  flag  PCP 
'0000' 1  0   1 
'0000' 2  1   1 
'0000' 3  1   0 
'0000' 4  0   0 
'1111' 11  1   1 
'1111' 12  0   0 
'1111' 13  0   0 
'2222' 1  0   0 
'2222' 2  0   0 
'2222' 3  0   0 

Примечание: в флаге актуальности является \ в {0,1 , 2}, и я хочу, чтобы PCP отражал флаг = 2. Таким образом, инкрементная сумма() не будет работать.

Редактировать: этот вопрос аналогичен (разный конец, и я не очень хорошо разбираюсь в SQl, чтобы знать, как получить результат, который я хочу получить от этого вопроса). Flag dates occurring after an event within individuals

Другое редактирование: в sqlite вы можете сравнивать строки и ints в операциях>/=, и я думаю, что в SQL вы не можете. Моя таблица находится в тексте, но сравнение с целыми числами идет достаточно хорошо, и вопрос выше ломается из-за ввода в SQL. см. http://sqlfiddle.com/#!3/00448/3

+0

окончательный ответ: http://sqlfiddle.com/#!7/86b91/1 основаны от принятого ответа. Я немного недоволен скоростью (я должен сделать это на 10^7 журналов) и буду искать оптимизацию. – ehacinom

ответ

1

Я основываю этот ответ на вашем SQL-скрипте, который вы опубликовали. Если UserID и PCP являются фактическими типами данных TEXT, тогда это должно сработать. Если они на самом деле варчар, то вы можете заменить LIKE знаком =.

Вам просто нужно использовать существует условие, чтобы искать любую запись с тем же идентификатором пользователя, который имеет conversiontagid = 2 и проверить время ....

Update logs 
Set PCP = '1' 
Where exists ( 
       select 1 
       from logs sub 
       where logs.userid LIKE sub.userid 
       and sub.conversiontagid = 2 
       and sub.t >= logs.t 
       ) 

Я сделал некоторые предположения с помощью SQL скрипку потому что это не совсем ясно, исходя из вашего вопроса выше. Но userID 4 имеет три записи, которые все происходили одновременно, поэтому я предположил, что все три имеют PCP, равный 1.

Вот скрипт SQL, показывающий тот же запрос, который используется в инструкции select вместо обновления заявление.

SQL Fiddle Example

+0

О, мужик, это красиво, спасибо. :) если возможно, вы знаете, как получить CalculatedPCP = 1 для всех журналов, у которых нет ConversionTagID = 2? Извините, это было непонятно! дело было в том, чтобы отклонить все журналы после того, как произошло серьезное Conversion = 2, но сохраните те, которые привели к тому, что OR ни к чему не привело. – ehacinom

+0

В основном я не совсем понимаю, что происходит в запросе, иначе я бы это сделал. спасибо :), вы создаете subtable sub всех журналов с правильным идентификатором пользователя? и затем происходит некоторая эквивалентность. Откуда вы знаете, какой 't' выбрать? – ehacinom

+1

Итак, если идентификатор пользователя не имеет записи журнала, где ConversionTagID = 2, вы хотите установить CalculatedPCP = 1 для всех этих записей? Измените EXISTS на NOT EXISTS и удалите файл sub.t> = logs.t. Столбец t - это просто время (в зависимости от того, что вы сказали в своем сообщении), поэтому исходный запрос говорит, если существует еще одна запись журнала для этого идентификатора пользователя, и запись происходит после того, как я коррелирую с AND, у него есть conversiontagid = 2, затем установите CalculatedPCP = 1. Я бы рекомендовал прочитать коррелированные подзапросы, чтобы лучше понять, что происходит. – JMK

Смежные вопросы