34,838
社区成员




create TABLE test(CardID VARCHAR(3),City VARCHAR(2),RegDate DATETIME)
INSERT INTO Test
SELECT '001','wh','2008-01-01 18:00:00' UNION ALL
SELECT '001','wh','2008-01-01 18:01:00' UNION ALL
SELECT '001','wh','2008-01-01 18:02:00' UNION ALL
SELECT '001','wh','2008-01-01 18:03:00' UNION ALL
SELECT '001','wh','2008-01-01 18:04:00' UNION ALL
SELECT '001','qd','2008-01-01 18:05:00' UNION ALL
SELECT '001','qd','2008-01-01 18:10:00' UNION ALL
SELECT '001','sh','2008-01-01 18:11:00' UNION ALL
SELECT '001','sh','2008-01-01 18:12:00' UNION ALL
SELECT '001','sh','2008-01-01 18:13:00' UNION ALL
SELECT '001','sh','2008-01-01 18:14:00' UNION ALL
SELECT '001','bj','2008-01-01 18:15:00' UNION ALL
SELECT '001','bj','2008-01-01 18:16:00' UNION ALL
SELECT '001','hn','2008-01-01 18:17:00' UNION ALL
SELECT '001','hn','2008-01-01 18:18:00' UNION ALL
SELECT '001','nb','2008-01-01 18:19:00' UNION ALL
SELECT '001','nb','2008-01-01 18:20:00'
go
select * from (select top 5 CardID,city,max(regdate) as RegDate from test group by CardID,city order by regdate desc) a order by RegDate
drop table test
/*结果
CardID city RegDate
------ ---- ------------------------------------------------------
001 qd 2008-01-01 18:10:00.000
001 sh 2008-01-01 18:14:00.000
001 bj 2008-01-01 18:16:00.000
001 hn 2008-01-01 18:18:00.000
001 nb 2008-01-01 18:20:00.000
(所影响的行数为 5 行)
*/
CREATE TABLE #A (C_NO VARCHAR(10),CITY VARCHAR(220),REG_DATE DATETIME)
INSERT INTO #A SELECT '001','wh','2008-01-01 18:00:00'
INSERT INTO #A SELECT '001','wh','2008-01-01 18:01:00'
INSERT INTO #A SELECT '001','wh','2008-01-01 18:02:00'
INSERT INTO #A SELECT '001','qd','2008-01-01 18:05:00'
INSERT INTO #A SELECT '001','qd','2008-01-01 18:10:00'
INSERT INTO #A SELECT '001','wh','2008-01-01 18:22:00'
INSERT INTO #A SELECT '001','wh','2008-01-01 18:36:00'
INSERT INTO #A SELECT '001','sh','2008-01-01 18:50:00'
go
declare @C_NO nvarchar(20),@city nvarchar(20),@reg_date datetime
declare @C_NOtemp nvarchar(20),@citytemp nvarchar(20),@reg_datetemp datetime
declare @table table(C_NO nvarchar(20),city nvarchar(20),reg_date datetime)
declare c cursor for select * from #A
open c
fetch next from c into @C_NOtemp,@citytemp,@reg_datetemp
while @@fetch_status = 0
begin
fetch next from c into @C_NO,@city,@reg_date
if(@citytemp <> @city)
insert @table select @C_NOtemp,@citytemp,@reg_datetemp
select @C_NOtemp=@C_NO,@citytemp=@city,@reg_datetemp=@reg_date
end
close c
deallocate c
insert @table select @C_NOtemp,@citytemp,@reg_datetemp
select * from @table
DECLARE @T TABLE (CardID VARCHAR(3),City VARCHAR(2),RegDate DATETIME)
INSERT INTO @T
SELECT '001','wh','2008-01-01 18:00:00' UNION ALL
SELECT '001','wh','2008-01-01 18:01:00' UNION ALL
SELECT '001','wh','2008-01-01 18:02:00' UNION ALL
SELECT '001','wh','2008-01-01 18:03:00' UNION ALL
SELECT '001','wh','2008-01-01 18:04:00' UNION ALL
SELECT '001','qd','2008-01-01 18:05:00' UNION ALL
SELECT '001','qd','2008-01-01 18:06:00' UNION ALL
SELECT '001','wh','2008-01-01 18:07:00' UNION ALL
SELECT '001','wh','2008-01-01 18:08:00' UNION ALL
SELECT '001','wh','2008-01-01 18:09:00' UNION ALL
SELECT '001','sh','2008-01-01 18:11:00' UNION ALL
SELECT '001','sh','2008-01-01 18:12:00' UNION ALL
SELECT '001','sh','2008-01-01 18:13:00' UNION ALL
SELECT '001','sh','2008-01-01 18:14:00' UNION ALL
SELECT '001','bj','2008-01-01 18:15:00' UNION ALL
SELECT '001','bj','2008-01-01 18:16:00' UNION ALL
SELECT '001','hn','2008-01-01 18:17:00' UNION ALL
SELECT '001','hn','2008-01-01 18:18:00' UNION ALL
SELECT '001','nb','2008-01-01 18:19:00' UNION ALL
SELECT '001','nb','2008-01-01 18:20:00' UNION ALL
SELECT '001','hn','2008-01-01 18:22:00' UNION ALL
SELECT '001','hn','2008-01-01 18:23:00'
;
WITH TEMP
AS
(
SELECT CardID,City,RegDate,ROW_NUMBER() OVER (ORDER BY RegDate) AS orders
FROM @T
)
SELECT TOP 5 CardID,City,RegDate
FROM (
SELECT * FROM TEMP A
WHERE EXISTS (SELECT * FROM TEMP B WHERE A.orders + 1 = B.orders AND A.City <> B.City
)
OR orders = (SELECT MAX(orders) FROM TEMP)
)X
ORDER BY orders DESC
/* 结果如下. 为什么你的和我的不同? 应该是你少了最后的"ORDER BY orders DESC"
CardID City RegDate
------ ---- -----------------------
001 hn 2008-01-01 18:23:00.000
001 nb 2008-01-01 18:20:00.000
001 hn 2008-01-01 18:18:00.000
001 bj 2008-01-01 18:16:00.000
001 sh 2008-01-01 18:14:00.000
*/
- SQL 2005写法 ,主要是生成序号.2000同理,生成序号就好办了
DECLARE @T TABLE (CardID VARCHAR(3),City VARCHAR(2),RegDate DATETIME)
INSERT INTO @T
SELECT '001','wh','2008-01-01 18:00:00' UNION ALL
SELECT '001','wh','2008-01-01 18:01:00' UNION ALL
SELECT '001','wh','2008-01-01 18:02:00' UNION ALL
SELECT '001','wh','2008-01-01 18:03:00' UNION ALL
SELECT '001','wh','2008-01-01 18:04:00' UNION ALL
SELECT '001','qd','2008-01-01 18:05:00' UNION ALL
SELECT '001','qd','2008-01-01 18:06:00' UNION ALL
SELECT '001','wh','2008-01-01 18:07:00' UNION ALL
SELECT '001','wh','2008-01-01 18:08:00' UNION ALL
SELECT '001','wh','2008-01-01 18:09:00' UNION ALL
SELECT '001','sh','2008-01-01 18:11:00' UNION ALL
SELECT '001','sh','2008-01-01 18:12:00' UNION ALL
SELECT '001','sh','2008-01-01 18:13:00' UNION ALL
SELECT '001','sh','2008-01-01 18:14:00' UNION ALL
SELECT '001','bj','2008-01-01 18:15:00' UNION ALL
SELECT '001','bj','2008-01-01 18:16:00' UNION ALL
SELECT '001','hn','2008-01-01 18:17:00' UNION ALL
SELECT '001','hn','2008-01-01 18:18:00' UNION ALL
SELECT '001','nb','2008-01-01 18:19:00' UNION ALL
SELECT '001','nb','2008-01-01 18:20:00'
;
WITH TEMP
AS
(
SELECT CardID,City,RegDate,ROW_NUMBER() OVER (ORDER BY RegDate) AS orders
FROM @T
)
SELECT TOP 5 CardID,City,RegDate
FROM (
SELECT * FROM TEMP A
WHERE EXISTS (SELECT * FROM TEMP B WHERE A.orders + 1 = B.orders AND A.City <> B.City
)
OR orders = (SELECT MAX(orders) FROM TEMP)
)X
ORDER BY orders DESC
--> liangCK小梁 于2008-10-30
--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (CardID VARCHAR(3),City VARCHAR(2),RegDate DATETIME)
INSERT INTO #T
SELECT '001','wh','2008-01-01 20:00:00' UNION ALL
SELECT '001','wh','2008-01-01 20:01:00' UNION ALL
SELECT '001','wh','2008-01-01 20:02:00' UNION ALL
SELECT '001','wh','2008-01-01 20:03:00' UNION ALL
SELECT '001','wh','2008-01-01 20:04:00' UNION ALL
SELECT '001','sz','2008-01-01 20:05:00' UNION ALL
SELECT '001','sz','2008-01-01 20:06:00' UNION ALL
SELECT '001','wh','2008-01-01 20:07:00' UNION ALL
SELECT '001','wh','2008-01-01 20:08:00' UNION ALL
SELECT '001','wh','2008-01-01 20:09:00' UNION ALL
SELECT '001','hz','2008-01-01 20:10:00' UNION ALL
SELECT '001','hz','2008-01-01 20:11:00' UNION ALL
SELECT '001','hz','2008-01-01 20:12:00'
--SQL查询如下:
SELECT TOP 5 CardID,
City,
MAX(RegDate) AS RegDate
FROM
(
SELECT *,
ROW=(SELECT COUNT(*)
FROM #T
WHERE CardID=T.CardID
AND RegDate<T.RegDate
AND City<>T.City)
FROM #T AS T
) AS T
GROUP BY CardID,City,ROW
ORDER BY RegDate DESC
/*
CardID City RegDate
------ ---- -----------------------
001 hz 2008-01-01 20:12:00.000
001 wh 2008-01-01 20:09:00.000
001 sz 2008-01-01 20:06:00.000
001 wh 2008-01-01 20:04:00.000
(4 行受影响)
*/
CREATE TABLE #A (C_NO VARCHAR(10),CITY VARCHAR(220),REG_DATE DATETIME)
INSERT INTO #A SELECT '001','wh','2008-01-01 18:00:00'
INSERT INTO #A SELECT '001','wh','2008-01-01 18:01:00'
INSERT INTO #A SELECT '001','wh','2008-01-01 18:02:00'
INSERT INTO #A SELECT '001','wh','2008-01-01 18:03:00'
INSERT INTO #A SELECT '001','wh','2008-01-01 18:04:00'
INSERT INTO #A SELECT '001','qd','2008-01-01 18:05:00'
INSERT INTO #A SELECT '001','qd','2008-01-01 18:10:00'
INSERT INTO #A SELECT '001','sh','2008-01-01 18:11:00'
INSERT INTO #A SELECT '001','sh','2008-01-01 18:12:00'
INSERT INTO #A SELECT '001','sh','2008-01-01 18:13:00'
INSERT INTO #A SELECT '001','sh','2008-01-01 18:14:00'
INSERT INTO #A SELECT '001','bj','2008-01-01 18:15:00'
INSERT INTO #A SELECT '001','bj','2008-01-01 18:16:00'
INSERT INTO #A SELECT '001','hn','2008-01-01 18:17:00'
INSERT INTO #A SELECT '001','hn','2008-01-01 18:18:00'
INSERT INTO #A SELECT '001','nb','2008-01-01 18:19:00'
INSERT INTO #A SELECT '001','nb','2008-01-01 18:20:00'
select * from
(
select top 5 C_NO,City,max(Reg_Date) Reg_Date from #A group by C_NO,City
order by max(Reg_Date) desc
)tbl order by Reg_Date