SQL查询获取顶行,直到ColName = 1

时间:2012-03-29 15:47:09

标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2

我在我的数据库中存储了一个消息列表(如果我崩溃了,我就不会丢失它们。)

但是当我将它们拉出来时,我需要将它们按顺序拉出来。

我正在寻找的是一个查询,它会在列IsWeirdMessage = 1之前为我提供前x行。

所以,假设我有一个看起来像这样的表:

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

我怎样才能制作一个查询,通过 SomeValue5 (按顺序)来获取 SomeValue1 ,并键入IsWeirdMessage

3 个答案:

答案 0 :(得分:5)

这样的事情应该这样做:

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 :(得分:1)

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;

答案 2 :(得分:0)

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是您要选择的分区标识符