Если вы не можете использовать lag
и lead
для других ответов здесь, вы можете добиться того же эффекта, создав row_number
с ServiceTag
как partition
и отсортировав его по [ 117] вы можете join
данные для себя через ServiceTag
и row_number
, чтобы получить ваши периоды между каждой строкой. Вы заметите, что это работает для нескольких значений ServiceTag
:
declare @t table(ServiceTag varchar(20), StatusType varchar(20), SystemUnitTRID int, ModifiedDateTime datetime);
insert into @t values
('IDXXX12','STATUS_1',145818840,'2019/01/18 08:35:27')
,('IDXXX12','STATUS_1',145820934,'2019/01/18 08:50:41')
,('IDXXX12','STATUS_1',145822116,'2019/01/18 08:59:18')
,('IDXXX12','STATUS_1',145825658,'2019/01/18 09:23:23')
,('IDXXX12','STATUS_1',145826849,'2019/01/18 09:30:55')
,('IDXXX13','STATUS_1',245818840,'2019/01/17 18:35:00')
,('IDXXX13','STATUS_1',245820934,'2019/01/17 18:50:00')
,('IDXXX13','STATUS_1',245822116,'2019/01/17 18:59:00')
,('IDXXX13','STATUS_1',245825658,'2019/01/17 19:23:00')
,('IDXXX13','STATUS_1',245826849,'2019/01/17 21:30:00')
,('IDXXX14','STATUS_2',345818840,'2019/01/16 18:35:00')
,('IDXXX14','STATUS_2',345820934,'2019/01/16 18:50:00')
,('IDXXX14','STATUS_2',345822116,'2019/01/16 18:59:00')
,('IDXXX14','STATUS_2',345825658,'2019/01/16 19:23:00')
,('IDXXX14','STATUS_2',345826849,'2019/01/16 19:30:00')
;
with d as
(
select ServiceTag
,StatusType
,SystemUnitTRID
,ModifiedDateTime
,row_number() over (partition by ServiceTag order by ModifiedDateTime) as rn
from @t
where StatusType = 'STATUS_1'
)
select d.ServiceTag
,d.SystemUnitTRID as id_sut
,d2.SystemUnitTRID as id_sut1
,d.ModifiedDateTime as sut
,d2.ModifiedDateTime as sut1
,datediff(minute,d.ModifiedDateTime,d2.ModifiedDateTime) as MinuteBoundaries -- Returns the number of minute boundaries crossed
,datediff(second,d.ModifiedDateTime,d2.ModifiedDateTime)/60 as WholeMinutes -- Returns the number of whole minutes
,right('00' + cast(datediff(second,d.ModifiedDateTime,d2.ModifiedDateTime)/60/60 as varchar(10)),2)
+ ':'
+ right('00' + cast(datediff(second,d.ModifiedDateTime,d2.ModifiedDateTime)/60%60 as varchar(10)),2) as FormattedTime
from d
join d as d2
on d.ServiceTag = d2.ServiceTag
and d.rn = d2.rn-1
order by d.ServiceTag
,d.ModifiedDateTime;
+------------+-----------+-----------+-------------------------+-------------------------+------------------+--------------+---------------+
| ServiceTag | id_sut | id_sut1 | sut | sut1 | MinuteBoundaries | WholeMinutes | FormattedTime |
+------------+-----------+-----------+-------------------------+-------------------------+------------------+--------------+---------------+
| IDXXX12 | 145818840 | 145820934 | 2019-01-18 08:35:27.000 | 2019-01-18 08:50:41.000 | 15 | 15 | 00:15 |
| IDXXX12 | 145820934 | 145822116 | 2019-01-18 08:50:41.000 | 2019-01-18 08:59:18.000 | 9 | 8 | 00:08 |
| IDXXX12 | 145822116 | 145825658 | 2019-01-18 08:59:18.000 | 2019-01-18 09:23:23.000 | 24 | 24 | 00:24 |
| IDXXX12 | 145825658 | 145826849 | 2019-01-18 09:23:23.000 | 2019-01-18 09:30:55.000 | 7 | 7 | 00:07 |
| IDXXX13 | 245818840 | 245820934 | 2019-01-17 18:35:00.000 | 2019-01-17 18:50:00.000 | 15 | 15 | 00:15 |
| IDXXX13 | 245820934 | 245822116 | 2019-01-17 18:50:00.000 | 2019-01-17 18:59:00.000 | 9 | 9 | 00:09 |
| IDXXX13 | 245822116 | 245825658 | 2019-01-17 18:59:00.000 | 2019-01-17 19:23:00.000 | 24 | 24 | 00:24 |
| IDXXX13 | 245825658 | 245826849 | 2019-01-17 19:23:00.000 | 2019-01-17 21:30:00.000 | 127 | 127 | 02:07 |
+------------+-----------+-----------+-------------------------+-------------------------+------------------+--------------+---------------+
Документация BeautifulSoup должна касаться всего, в чем Вы нуждаетесь - в этом случае похоже, что Вы хотите использовать findNext
:
headerRows[0][10].findNext('b').string
Более универсальное решение, которое не полагается <b>
тег состоял бы в том, чтобы использовать текстовый аргумент findAll
, который позволяет Вам искать только NavigableString
объекты:
>>> s = BeautifulSoup(u'<p>Test 1 <span>More</span> Test 2</p>')
>>> u''.join([s.string for s in s.findAll(text=True)])
u'Test 1 More Test 2'
У меня есть базовый класс, что я расширяю все Красивые классы Супа с помощью набора методов, которые помогают мне достигнуть текст в группе элементов, из которых я не обязательно хочу полагаться на структуру. Один из тех методов следующий:
def clean(self, val):
if type(val) is not StringType: val = str(val)
val = re.sub(r'<.*?>', '', s) #remove tags
val = re.sub("\s+" , " ", val) #collapse internal whitespace
return val.strip() #remove leading & trailing whitespace