SQL-запрос для получения верхних строк, пока ColName = 1 - PullRequest
3 голосов
/ 29 марта 2012

Я храню список Сообщений в своей базе данных (чтобы в случае сбоя я их не потерял).

Но когда я вытащил их, мне нужно вытащить их порциями и в порядке.

Я ищу запрос, который даст мне верхние x строк до столбца IsWeirdMessage = 1.

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

CREATE TABLE MyMessages(MessageId bigint IDENTITY(1,1),
    MyMessage varchar(100), IsWeirdMessage bit)

INSERT INTO MyMessages(MyMessage, IsWeirdMessage)
SELECT 'SomeValue1', 0 UNION ALL
SELECT 'SomeValue2', 0 UNION ALL
SELECT 'SomeValue3', 0 UNION ALL
SELECT 'SomeValue3', 0 UNION ALL
SELECT 'SomeValue4', 0 UNION ALL
SELECT 'SomeValue5', 0 UNION ALL
SELECT 'WeirdThingHere', 1 UNION ALL
SELECT 'SomeValue7', 0 UNION ALL
SELECT 'SomeValue8', 0 UNION ALL
SELECT 'SomeValue9', 0 UNION ALL
SELECT 'OtherWeirdStuff', 1 UNION ALL
SELECT 'SomeValue11', 0  
GO

Как создать запрос, который получит меня SomeValue1 до SomeValue5 (по порядку), отключив IsWeirdMessage?

Ответы [ 3 ]

5 голосов
/ 29 марта 2012

Что-то вроде этого должно сделать это:

select * from MyMessages
where messageid > @MessageID
and messageid <=
  (select min(messageid) from MyMessages
   where IsWeirdMessage = 1 and messageid > @MessageID)
order by messageid

Где @MessageID - это значение последнего странного сообщения, которое вы получили. Вы должны начать с 0, чтобы получить первую партию, затем 7, чтобы получить вторую партию и т. Д.

Демо: http://www.sqlfiddle.com/#!3/10336/9

1 голос
/ 29 марта 2012
SELECT m.MessageID, m.MyMessage
FROM dbo.MyMessages AS m
WHERE NOT EXISTS 
(
  SELECT 1 FROM dbo.MyMessages AS m2
  WHERE IsWeirdMessage = 1 
  AND m2.MessageID < m.MessageID
)
ORDER BY MessageID;
0 голосов
/ 01 апреля 2012
select b.*
from
    (   select
            row_number() over (order by (select 1)) as PartitionId
            ,isnull((select max(t.MessageId) from MyMessages t where t.MessageId < tb.MessageId and t.IsWeirdMessage = 1), 0) as StartID
            ,tb.MessageId as EndId
        from MyMessages tb
        where IsWeirdMessage = 1
        union all
        select count(case when IsWeirdMessage = 1 then MessageId else null end) + 1
            ,max(case when IsWeirdMessage = 1 then MessageId else 0 end)
            ,max(messageId) + 1
        from MyMessages
    ) as a
    cross apply 
    (   select * from MyMessages b
        where
            b.MessageId > a.StartID
            and b.MessageId < a.EndID
    ) as b
where a.PartitionId = @PartID

где @PartID - это идентификатор раздела, который вы хотите выбрать

...