请教一个按指定数量分组查询的问题

华山沦贱 2017-04-13 07:21:40
某公司有个刷卡记录,某天某人可以在某地点刷卡不限次数,但最终查询的结果只需查看某天某人在某地点刷卡的前N条记录(以时间排序),限定次数N的表为:

ID 姓名 地点 限定次数
1 AA XX 2
2 AA YY 4
3 BB XX 1
4 BB YY 2

刷卡记录表为:
ID 姓名 地点 刷卡时间
1 AA XX 2017-01-01 09:00:01
2 AA XX 2017-01-01 09:30:01
3 AA XX 2017-01-01 14:50:30
4 BB XX 2017-01-01 07:12:01
5 BB XX 2017-01-01 09:32:01
6 BB YY 2017-01-02 19:32:01


要求查询结果为:
ID 姓名 地点 刷卡时间
1 AA XX 2017-01-01 09:00:01
2 AA XX 2017-01-01 09:30:01
3 BB XX 2017-01-01 07:12:01
4 BB YY 2017-01-02 19:32:01

...全文
169 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
华山沦贱 2017-04-13
  • 打赏
  • 举报
回复
综合1、2楼,得出需要的结果:

--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([ID] int,[姓名] nvarchar(22),[地点] nvarchar(22),[限定次数] int)
Insert #A
select 1,N'AA',N'XX',2 union all
select 2,N'AA',N'YY',4 union all
select 3,N'BB',N'XX',1 union all
select 4,N'BB',N'YY',2
GO
if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([ID] int,[姓名] nvarchar(22),[地点] nvarchar(22),[刷卡时间] DATETIME)
Insert #B
select 1,N'AA',N'XX','2017-01-01 09:00:01' union all
select 2,N'AA',N'XX','2017-01-01 09:30:01' union all
select 3,N'AA',N'XX','2017-01-01 14:50:30' union all
select 4,N'BB',N'XX','2017-01-01 07:12:01' union all
select 5,N'BB',N'XX','2017-01-01 09:32:01' union all
select 6,N'BB',N'YY','2017-01-02 19:32:01'
Go
--测试数据结束
;WITH tempa AS(
SELECT * FROM #A
),tempb AS (
SELECT *,ROW_NUMBER()OVER(PARTITION BY 姓名,地点,day(刷卡时间) ORDER BY ID) AS num FROM #B
)

SELECT tempb.ID ,
tempb.姓名 ,
tempb.地点 ,
tempb.刷卡时间 from tempb left JOIN tempa ON tempb.姓名 = tempa.姓名 and tempb.地点 = tempa.地点
where tempb.num <= tempa.限定次数




二月十六 2017-04-13
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([ID] int,[姓名] nvarchar(22),[地点] nvarchar(22),[限定次数] int)
Insert #A
select 1,N'AA',N'XX',2 union all
select 2,N'AA',N'XX',4 union all
select 3,N'BB',N'XX',1 union all
select 4,N'BB',N'YY',2
GO
if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([ID] int,[姓名] nvarchar(22),[地点] nvarchar(22),[刷卡时间] DATETIME)
Insert #B
select 1,N'AA',N'XX','2017-01-01 09:00:01' union all
select 2,N'AA',N'XX','2017-01-01 09:30:01' union all
select 3,N'AA',N'XX','2017-01-01 14:50:30' union all
select 4,N'BB',N'XX','2017-01-01 07:12:01' union all
select 5,N'BB',N'XX','2017-01-01 09:32:01' union all
select 6,N'BB',N'YY','2017-01-02 19:32:01'
Go
--测试数据结束
;WITH tempa AS(
SELECT *,ROW_NUMBER()OVER(PARTITION BY 姓名 ORDER BY ID) AS num FROM #A
),tempb AS (
SELECT *,ROW_NUMBER()OVER(PARTITION BY 姓名 ORDER BY ID) AS num FROM #B
)
SELECT tempb.ID ,
tempb.姓名 ,
tempb.地点 ,
tempb.刷卡时间
FROM tempa
JOIN tempb ON tempb.num = tempa.num
AND tempb.姓名 = tempa.姓名;



卖水果的net 2017-04-13
  • 打赏
  • 举报
回复
with m as ( select a.*,row_number() over(partition by 姓名,地点 order by 时间 ) rn ) select * from m,b where m.姓名 = b.姓名 and m.地点 = b.地点 and rn <= 次数

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧