2014-10-25 4 views
0

Я хочу добавить к первому значению checkin и последнему значению checkout на основании того же местоположения и той же даты.Установить значение SQL на основе другого значения?

я запускаю этот запрос:

select USERID , CHECKTIME , SENSORID 
from CHECKINOUT 
where USERID = 15 

Что я имею в виду:

USERID CHECKTIME   SENSORID 
------------------------------------ 
15 2014-10-20 01:22:01.000 100 
15 2014-10-20 12:38:22.000 100 
15 2014-10-20 22:00:54.000 100 
15 2014-10-21 01:24:30.000 100 
15 2014-10-21 07:31:39.000 100 
15 2014-10-21 22:11:47.000 100 
15 2014-10-22 00:10:34.000 100 
15 2014-10-22 05:51:47.000 100 

быть:

USERID CHECKTIME     SENSORID 
--------------------------------------------- 
15 2014-10-20 01:22:01.000-checkin  100 
15 2014-10-20 12:38:22.000-checkout 100 
15 2014-10-20 22:00:54.000-checkin  100 
15 2014-10-21 01:24:30.000-checkin  100 
15 2014-10-21 07:31:39.000-checkout 100 
15 2014-10-21 22:11:47.000-checkin  100 
15 2014-10-22 00:10:34.000-checkin  100 
15 2014-10-22 05:51:47.000-checkout 100 

Но на основе sensorid быть одинаковыми, и в тот же день.

+1

Непонятно, что вы просите. Не могли бы вы лучше объяснить, что хотите? –

+1

где находится поле местоположения? –

+0

Поле местоположения SENSORID. – user1472886

ответ

0

Попробуйте Как это

select USERID,CHECKTIME + case when code % 2 =0 then '- Check out' 
else ' -Check IN' end,SENSORID from (
select *,ROW_NUMBER() over(PARTITION BY USERID,CHECKTIME 
          order by USERID ,CHECKTIME) code 
from table1) as t1 
+0

, он дал мне ошибку «Msg 241, уровень 16, состояние 1, строка 1 Конверсия не удалась при преобразовании даты и/или времени из символьной строки. « – user1472886

+0

OK, вы получили сообщение об ошибке. Сообщение об ошибке сообщает о наличии проблемы с преобразованием типов. Вы попробовали что-нибудь, чтобы заставить его работать? Ответ прочен и должен работать, чтобы дать вам то, что вам кажется нужным. Но в вашем конкретном случае могут быть некоторые морщины. Измените что-нибудь, что угодно, чтобы увидеть, можете ли вы - о, я не знаю, - может быть, найти проблему самостоятельно. Вот подсказка. Решение не выполняет никаких манипуляций с датами. Таким образом, дата указана в ваших данных. Поэтому, если 'checktime' является полем datetime, вы не можете конкатенировать строки. Поэтому, возможно, соглашайтесь на сгенерированное поле рядом с ним. – TommCatt

0

попробовать это, это может помочь вам:

select userid,convert(varchar(30),checktime,121) + 
     case when 
     ((row_number() over (partition by userid,sensorid,convert(varchar(30),checktime,101) 
          order by checktime))%2 = 0) 
     then '-checkout' 
     else '-checkin' end 
     as checktime,sensorid 
from temt 
where userid = 15 

here является демо-SQL скрипку

вот решение, если вы хотите добавить новый столбец со значениями:

alter table temt 
add checkinorout varchar(50) 
;with cte_update (userid,checkinorout,ctime,sensorid) as 
(
    select userid,checkinorout,convert(varchar(30),checktime,121) + 
     case when 
     ((row_number() over (partition by userid,sensorid,convert(varchar(30),checktime,101) 
           order by checktime))%2 = 0) 
      then '-checkout' 
      else '-checkin' end 
    as ctime,sensorid 
    from temt 
) 
update cte_update set checkinorout = ctime 


select * from temt 

here является демонстрационным скриптом.

+0

firest благодарит за ваш ответ :) его работа, но когда я лоток, чтобы «выбрать USERID, CHECKTIME, SENSORID из CHECKINOUT order by CHECKTIME», он дал мне нормальный оператор, который мне нужен, когда я выбираю этот нормальный статус, я нашел таблицу, когда вы ответили мне – user1472886

+0

, так что вы хотите получить желаемый результат с помощью простого оператора select. верный? –

+0

yes MR user2315555 или вы можете сказать, что я хочу отредактировать контрольное время столбца, чтобы быть проверкой даты или времени, извините im new @ SQL – user1472886

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