Получить минимальное и максимальное время из одной таблицы на сервере SQL - PullRequest
0 голосов
/ 30 марта 2012

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

**id   Date     Time   Status**
  01   1/02/12  8:10   Entry
  01   1/02/12  9:00   Exit
  01   1/02/12  9:10   entry
  01   1/02/12  17:00  Exit
  02   1/02/12  8:10   Entry
  02   1/02/12  9:00   Exit
  02   1/02/12  9:10   entry
  02   1/02/12  17:00  Exit
  **03   1/02/12  17:00  Exit**

Мне нужно узнать только минимальное и максимальное время каждого идентификатора

Ожидаемый результат

**id   Date     Entry     Exit  **
  01   1/02/12  8:10      17:00
  02   1/02/12  8:10      17:00

Пожалуйста, помогите мне

Этот код работает отлично, но если одна запись не добавлена, добавляется только выход, затем я хочу отобразить

id   Date     Entry Exit
---- -------- ----- -----
01   01/02/12 08:10 17:00
02   01/02/12 08:10 17:00
**03   01/02/12 Null  17:00**

Пожалуйста, помогите мне Спасибо заранее

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Примерно так может работать в зависимости от используемых типов данных.

declare @T table
(
  id varchar(2),
  [Date] datetime,
  [Time] varchar(5),
  [Status] varchar(5)
)

insert into @T
select '01',   '1/02/12',  '8:10',   'Entry' union all
select '01',   '1/02/12',  '9:00',   'Exit' union all
select '01',   '1/02/12',  '9:10',   'entry' union all
select '01',   '1/02/12',  '17:00',  'Exit' union all
select '02',   '1/02/12',  '8:10',   'Entry' union all
select '02',   '1/02/12',  '9:00',   'Exit' union all
select '02',   '1/02/12',  '9:10',   'entry' union all
select '02',   '1/02/12',  '17:00',  'Exit'

select id,
       convert(varchar(8), [Date], 1) as [Date],
       convert(varchar(5), min([Time]), 108) as [Entry],
       convert(varchar(5), max([Time]), 108) as [Exit]
from
  (
    select id,
           [Date],
           cast([Time] as datetime) as [Time],
           row_number() over(partition by id order by [Date]+cast([Time] as datetime) asc) as rn1,
           row_number() over(partition by id order by [Date]+cast([Time] as datetime) desc) as rn2
    from @T
  ) as T
where T.rn1 = 1 or
      T.rn2 = 1
group by id, [Date]

Результат:

id   Date     Entry Exit
---- -------- ----- -----
01   01/02/12 08:10 17:00
02   01/02/12 08:10 17:00
0 голосов
/ 30 марта 2012

Напишите запрос, как показано ниже

Select * from MyTable where Time = (Select min(Time) from MyTable) and Status = 'Entry'

и

Select * from MyTable where Time = (Select max(Time) from MyTable) and Status = 'Exit'

EDIT:

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

SELECT DISTINCT MyTable.ID, MyTable.Date, MyTable.Time AS Entry, MyTable_2.Time AS
[Exit] FROM MyTable CROSS JOIN MyTable AS MyTable_2 WHERE (MyTable.Time =
(SELECT MIN(Time) AS Expr1 FROM MyTable AS MyTable_1)) AND (MyTable.Status = 'Entry') 
AND (MyTable_2.Time = (SELECT MAX(Time) AS Expr2 FROM MyTable AS MyTable_3)) AND 
(MyTable_2.Status = 'Exit')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...