如下表:
ID State Date
12 1 2009-07-16 10:00
45 2 2009-07-16 13:00
67 2 2009-07-16 14:40
77 1 2009-07-16 15:00
89 1 2009-07-16 15:30
99 1 2009-07-16 16:00
题:
我怎么能集团由场“国家”,同时仍然保持状态的变化之间的边界?
SELECT MIN(ID) AS ID, State, MIN(Date) AS Date, COUNT(ID) AS Count
FROM table GROUP BY State
结果如下:
ID State Date Count
12 1 2009-07-16 10:00 4
45 2 2009-07-16 13:00 2
但预计:
ID State Date Count
12 1 2009-07-16 10:00 1
45 2 2009-07-16 13:00 2
77 1 2009-07-16 15:00 3
这是可能的SQL? 我没有找到一个解决方案至今...
SELECT MIN(id) AS id, MIN(ts) AS ts, MIN(state) AS state, COUNT(*) cnt
FROM (
SELECT @r := @r + (@state != state) AS gn,
@state := state AS sn,
s.*
FROM (
SELECT @r := 0,
@state := 0
) vars,
t_state s
ORDER BY
ts
) q
GROUP BY
gn
测试表创建脚本:
CREATE TABLE t_state (id INT NOT NULL PRIMARY KEY, state INT NOT NULL, ts DATETIME NOT NULL);
INSERT
INTO t_state
VALUES
(12, 1, '2009-07-16 10:00'),
(45, 2, '2009-07-16 13:00'),
(67, 2, '2009-07-16 14:40'),
(77, 1, '2009-07-16 15:00'),
(89, 1, '2009-07-16 15:30'),
(99, 1, '2009-07-16 16:00');
这是如何与热膨胀系数做MSSQL服务器上
-- DROP TABLE MyLog
CREATE TABLE MyLog(
ID INT PRIMARY KEY
, State INT
, Date DATETIME
)
INSERT MyLog
SELECT 12, 1, '2009-07-16 10:00' UNION ALL
SELECT 45, 2, '2009-07-16 13:00' UNION ALL
SELECT 67, 2, '2009-07-16 14:40' UNION ALL
SELECT 77, 1, '2009-07-16 15:00' UNION ALL
SELECT 89, 1, '2009-07-16 15:30' UNION ALL
SELECT 99, 1, '2009-07-16 16:00'
;WITH CTE
AS (
SELECT ROW_NUMBER() OVER(ORDER BY ID) AS RowNo
, *
FROM MyLog
)
, MyLogGroup
AS (
SELECT l.*
, ( SELECT MAX(ID)
FROM CTE c
WHERE NOT EXISTS (SELECT * FROM CTE
WHERE RowNo = c.RowNo-1 AND State = c.State)
AND c.ID <= l.ID) AS GroupID
FROM MyLog l
)
SELECT *
FROM MyLogGroup
这里是如何解决像由Quassnoi工作提供了一个冗长的说明
我可能是说明明显在这里,但如果你愿意使用Transact-SQL,你可以通过表中的行进行迭代,并建立自己的结果集,这可能似乎是一个麻烦,但它肯定会工作。 迭代可以做到不使用游标 。