• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

如何获取一个月里连续3天Flag为2的记录

angelcool 2010-06-25 09:08:18
如何获取一个月里连续3天Flag为2的记录。

table_06(6月的表格)定义如下:
ID
Flag
Date(日期,仅包含1-31,类型为字符串)
。。。


ID Flag Date
232 1 1
232 2 2
232 1 3
233 4 2
233 2 3
233 3 4
dff 1 7


希望得到的结果是:

ID Count
233 3

搜到一个类似的,但这个是Oracle的,我的数据库是Sybase,无法执行。
应该怎样修改呢?或者应该怎样实现?

select ID,count(1) from (
select * from
(select ID,Date,cnt,lag(Date,1,Date-1) over(partition by ID order by rownum) last from table_06)
where Date=last+1)
group by ID having count(1)>=3
...全文
109 点赞 收藏 16
写回复
16 条回复
htl258_Tony 2010年06月25日
[Quote=引用 13 楼 angelcool 的回复:]
to htl258

AND EXISTS(
SELECT 1
FROM tb
WHERE id = t.id
AND (date=t.date+1 OR date=t.date-1)

好像只能保证当前记录前后有一条记录Flag>=3,
而且我现在要求查询连续10天Flag>=3,好像就不行了呀!!
[/Quote]
改HAVING的:

SELECT ID, COUNT(1) cnt 
FROM [tb] t
WHERE EXISTS(
SELECT 1
FROM tb
WHERE id = t.id
AND flag >= 3
)
AND EXISTS(
SELECT 1
FROM tb
WHERE id = t.id
AND (date=t.date+1 OR date=t.date-1)
)
GROUP BY ID
HAVING COUNT(1)>=10

回复 点赞
chuifengde 2010年06月25日
[Quote=引用 13 楼 angelcool 的回复:]
to htl258

AND EXISTS(
SELECT 1
FROM tb
WHERE id = t.id
AND (date=t.date+1 OR date=t.date-1)

好像只能保证当前记录前后有一条记录Flag>=3,
而且我现在要求查询连续10天Flag>=3,好像就不行了呀!!
[/Quote]
看9楼把count()>2改成count()>9 flag>2 改成flag>3
回复 点赞
angelcool 2010年06月25日
to htl258

AND EXISTS(
SELECT 1
FROM tb
WHERE id = t.id
AND (date=t.date+1 OR date=t.date-1)

好像只能保证当前记录前后有一条记录Flag>=3,
而且我现在要求查询连续10天Flag>=3,好像就不行了呀!!
回复 点赞
老黎 2010年06月25日
赛贝斯,不懂
回复 点赞
htl258_Tony 2010年06月25日
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([ID] [nvarchar](10),[Flag] [int],[Date] [int])
INSERT INTO [tb]
SELECT '232','1','1' UNION ALL
SELECT '232','2','2' UNION ALL
SELECT '232','1','3' UNION ALL
SELECT '233','4','2' UNION ALL
SELECT '233','2','3' UNION ALL
SELECT '233','3','4' UNION ALL
SELECT 'dff','1','7'


-->SQL查询如下:

SELECT ID, COUNT(1) cnt
FROM [tb] t
WHERE EXISTS(
SELECT 1
FROM tb
WHERE id = t.id
AND flag >= 3
)
AND EXISTS(
SELECT 1
FROM tb
WHERE id = t.id
AND (date=t.date+1 OR date=t.date-1)
)
GROUP BY ID
HAVING COUNT(1)>=3

/*
ID cnt
---------- -----------
233 3

(1 行受影响)
*/
回复 点赞
htl258_Tony 2010年06月25日
[Quote=引用 8 楼 angelcool 的回复:]
to xys_777
在Sybase开贴了,但等了一天都没人回答,才在这里开贴的。


to TheGodOfGods
是我的失误,233的Flag值应均大于3
[/Quote]

楼主,这就是你的不对了
回复 点赞
chuifengde 2010年06月25日
--ID相同且连续三天或三天以上Flag值大于等于2的ID及数量 
declare @a table(ID INT, Flag INT, Date INT)
INSERT @a SELECT 232, 1, 1
union all select 232 ,2, 2
union all select 232 ,1, 3
union all select 233, 4, 2
union all select 233, 2, 3
union all select 233, 3, 4
union all select 333, 1, 7

SELECT id,COUNT(date-o) [COUNT] FROM
(
SELECT * ,o=(SELECT COUNT(1)+1 FROM @a WHERE id=a.id AND date<a.date AND flag>=2)
FROM @a a
WHERE flag>=2
)aa
GROUP BY id,date-o
HAVING COUNT(date-o)>2
--result
/*
id COUNT
----------- -----------
233 3

(所影响的行数为 1 行)

*/
回复 点赞
angelcool 2010年06月25日
to xys_777
在Sybase开贴了,但等了一天都没人回答,才在这里开贴的。


to TheGodOfGods
是我的失误,233的Flag值应均大于3
回复 点赞
Mr_Nice 2010年06月25日
--> 测试数据:[TB]
if object_id('[TB]') is not null drop table [TB]
create table [TB]([ID] varchar(3),[Flag] int,[Date] int)
insert [TB]
select '232',1,1 union all
select '232',2,2 union all
select '232',1,3 union all
select '233',2,2 union all
select '233',2,3 union all
select '233',2,4 union all
select 'dff',1,7

select * from [TB]




;WITH TT
AS(
SELECT id,flag,date, [rowid]=ROW_NUMBER()OVER (PARTITION BY id ORDER BY date) FROM TB WHERE flag = 2)

SELECT id,cnt = COUNT(1)
FROM (
SELECT * FROM TT WHERE date = rowid+1
)A
GROUP BY id HAVING COUNT(1)>=3

/*id cnt
---- -----------
233 3

(1 行受影响)*/
回复 点赞
永生天地 2010年06月25日
[Quote=引用楼主 angelcool 的回复:]
我的数据库是Sybase

[/Quote]

帮顶,可再发到sybase里问问
回复 点赞
htl258_Tony 2010年06月25日
-->加个大于等于三天的条件:

SELECT ID, COUNT(1) cnt
FROM [tb] t
WHERE EXISTS(
SELECT 1
FROM tb
WHERE id = t.id
AND flag = 2
)
AND EXISTS(
SELECT 1
FROM tb
WHERE id = t.id
AND (date=t.date+1 OR date=t.date-1)
)
GROUP BY ID
HAVING COUNT(1)>=3

/*
ID cnt
---------- -----------
232 3
233 3

(2 行受影响)
*/
回复 点赞
htl258_Tony 2010年06月25日
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([ID] [nvarchar](10),[Flag] [int],[Date] [int])
INSERT INTO [tb]
SELECT '232','1','1' UNION ALL
SELECT '232','2','2' UNION ALL
SELECT '232','1','3' UNION ALL
SELECT '233','4','2' UNION ALL
SELECT '233','2','3' UNION ALL
SELECT '233','3','4' UNION ALL
SELECT 'dff','1','7'


-->SQL查询如下:

SELECT ID, COUNT(1) cnt
FROM [tb] t
WHERE EXISTS(
SELECT 1
FROM tb
WHERE id = t.id
AND flag = 2
)
AND EXISTS(
SELECT 1
FROM tb
WHERE id = t.id
AND (date=t.date+1 OR date=t.date-1)
)
GROUP BY ID

/*
ID cnt
---------- -----------
232 3
233 3

(2 行受影响)
*/
回复 点赞
Mr_Nice 2010年06月25日
ID Flag Date
232 1 1
232 2 2
232 1 3
233 4 2
233 2 3
233 3 4
dff 1 7

里面没有连续3天flag = 2的阿?
回复 点赞
htl258_Tony 2010年06月25日
描述与结果不相对吧。
回复 点赞
TheGodOfGods 2010年06月25日
233只有连续两天吧flag为2吧。lz出错题了
回复 点赞
angelcool 2010年06月25日
to htl258


运行了快一个小时了,可还没出结果??
好像语句有什么问题呀!!

回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告