Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сравнение строк  [new]
FastTI
Member

Откуда:
Сообщений: 44
Привет, возник вопрос на который не могу найти ответа)) наверное это не сложно но я чеовек новый в этом деле поэтому подскажите кто что знает)


итак есть результат выборки
40647388    2015-07-26 20:21:36.000 2015-07-27 00:00:00.000 1   0119    O27 NULL    2015-07-26 20:22:02.000 
40648214    2015-07-26 21:26:57.000 2015-07-27 00:00:00.000 1   0119    O27 NULL    2015-07-26 21:32:19.000 
40648276    2015-07-26 21:32:19.000 2015-07-27 00:00:00.000 1   0119    O23 NULL    2015-07-26 21:36:41.000 
40648337    2015-07-26 21:36:41.000 2015-07-27 00:00:00.000 1   0119    O27 NULL    2015-07-26 21:48:46.000 
40654739    2015-07-27 06:21:40.000 2015-07-27 00:00:00.000 1   0119    O27 NULL    2015-07-27 06:26:08.000 
40654798    2015-07-27 06:26:08.000 2015-07-27 00:00:00.000 1   0119    O23 NULL    2015-07-27 06:32:11.000 
40654899    2015-07-27 06:32:11.000 2015-07-27 00:00:00.000 1   0119    O27 NULL    2015-07-27 06:32:16.000


мне нужно посчитать количество статусов O27 у которых время начала не совпадает со временем конца статуса O23

я написал запрос вида

DECLARE @start_date DATE, @end_date DATE, @equip VARCHAR(4), @shift_ident VARCHAR(2)
SET @start_date = '2015-07-27'
SET @end_date = '2015-07-27'
SET @shift_ident ='1'
SET @equip ='0119'
 
(SELECT
            START
            FROM
            (SELECT 
                top 1 (est2.END_TIMESTAMP) AS ends,
                
                          (SELECT 
                                 COUNT(est3.START_TIMESTAMP) 
                         FROM 
                            EQUIPMENT_STATUS_TRANS est3
                         WHERE est3.STATUS_CODE IN ('O27') 
                         AND est3.EQUIP_IDENT = est2.EQUIP_IDENT 
                         AND  est3.SHIFT_DATE BETWEEN @start_date AND @end_date 
                         AND @shift_ident LIKE '%' + est3.SHIFT_IDENT + '%' 
                         AND est2.END_TIMESTAMP != est3.START_TIMESTAMP
                         )AS START
            FROM 
                dbo.EQUIPMENT_STATUS_TRANS est2
            WHERE est2.STATUS_CODE IN('O23') 
            AND est2.EQUIP_IDENT = @equip
            AND  est2.SHIFT_DATE BETWEEN @start_date AND @end_date 
            AND @shift_ident LIKE '%' + est2.SHIFT_IDENT + '%' 
            ) AS Mov)



выдает количество 4-ре хотя должно быть 3 (так как совпадений где время начала O27 = времени конца O23 всего 2)
проанализовав я понял что считает так потому что сравнивает по 1-му статусу O23 пропуская 2-й поэтому сранивая натыкается на 1 совпадения считая остальные (top 1 убирать я пробовал ситуация та же)

ну вопрос вообщем следующий: как сравнить не по одной а по всем строкам? чтобы учитывались оба статуса О23?
29 июл 15, 11:32    [17949016]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение строк  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
FastTI,

Версию сервера назовите для начала
29 июл 15, 11:48    [17949133]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение строк  [new]
Jaffar
Member

Откуда:
Сообщений: 633
FastTI,

Может так?
select count(1)
from Table1 t with(nolock)
where
		t.Status = 'O27'
and		t.TimeStart not in (select distinct t.TimeBegin from Table1 t with(nolock) where t.Status = 'O23')


Или сформулируй условие точнее.
Как для строчки О27 определить соотв. ей строчку О23.
29 июл 15, 11:51    [17949163]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение строк  [new]
o-o
Guest
тестовые данные набирайте, плиз, сами
declare @t table (START_TIMESTAMP datetime, STATUS_CODE varchar(10), END_TIMESTAMP datetime);
insert into @t values  
('2015-07-26 20:21:36.000', 'O27', '2015-07-26 20:22:02.000') ,
('2015-07-26 21:26:57.000', 'O27', '2015-07-26 21:32:19.000') ,
('2015-07-26 21:32:19.000', 'O23', '2015-07-26 21:36:41.000' ),
('2015-07-26 21:36:41.000', 'O27', '2015-07-26 21:48:46.000' ),
('2015-07-27 06:21:40.000', 'O27', '2015-07-27 06:26:08.000' ),
('2015-07-27 06:26:08.000', 'O23', '2015-07-27 06:32:11.000' ),
('2015-07-27 06:32:11.000', 'O27', '2015-07-27 06:32:16.000')

select COUNT (*)
from @t t1
where STATUS_CODE = 'O27' and not exists (select * 
                                          from @t t2
                                          where t2.STATUS_CODE = 'O23' and t1.START_TIMESTAMP = t2.END_TIMESTAMP)
29 июл 15, 13:19    [17949802]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение строк  [new]
FastTI
Member

Откуда:
Сообщений: 44
Jaffar,

Да суть именно та что нужно, большое человеческое спасибо за наводку...
29 июл 15, 16:22    [17951121]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение строк  [new]
FastTI
Member

Откуда:
Сообщений: 44
o-o,

Благодарю, переписал под себя все работает. Вроде все не сложно, но тупил с этим моментом. Спасибо!
29 июл 15, 16:23    [17951130]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить