如何获取一个月里连续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
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
232 1 1
232 2 2
232 1 3
233 4 2
233 2 3
233 3 4
dff 1 7里面没有连续3天flag = 2的阿?
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 行受影响)
*/
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 行受影响)
*/
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,7select * 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 行受影响)*/
在Sybase开贴了,但等了一天都没人回答,才在这里开贴的。
to TheGodOfGods
是我的失误,233的Flag值应均大于3
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, 7SELECT 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 行)*/
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 行受影响)
*/
SELECT 1
FROM tb
WHERE id = t.id
AND (date=t.date+1 OR date=t.date-1)好像只能保证当前记录前后有一条记录Flag>=3,
而且我现在要求查询连续10天Flag>=3,好像就不行了呀!!
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
运行了快一个小时了,可还没出结果??
好像语句有什么问题呀!!