SELECT B.* FROM dbo.userTb A INNER JOIN dbo.AuctionSell b ON A.UserId = b.CreateUid
WHERE ( SELECT COUNT(1) FROM dbo.AuctionSell n WHERE n.CreateUid = a.UserId AND n.ASID <= b.ASID ) <= 3 order by a.userid
上面的语句是查询 每个Userid 前三条数据,与使用 orver partition by 的查询结果一样,但是本人不明白上面语句查询中 AND n.ASID <= b.ASID 的意思,为什么去掉这句结果就不一样啦,求大牛详解
ASID 是dbo.AuctionSell的主键
这句是获取n中CreateUid=a.UserId,且ASID小于b.ASID的记录条数。注意到n和b都是dbo.AuctionSell,因此这个子查询实际上是获取按ASID排序的序号。例如ASID最小的那条记录,只有一条记录(就是自己)的ASID小于等于它,所以子查询结果是1。而第10小的记录,一共有10条记录(包括自己)的ASID小于等于它,所以子查询结果是10。
这种写法是row_number()的一种替代写法,适用于不支持row_number()的场合
追问谢谢回复, 不过还是不太明白AND n.ASID <= b.ASID 的意思,,可否再详细点,或举个小例子
追答假如tmp表中数据如下:
查询语句是:
select a.id,a.name,那么对于第一行数据,子查询变为:
select count(b.id) from tmp b where b.name='a' and b.id<=1其结果为1。同理,对第二、三行数据,子查询变为:
select count(b.id) from tmp b where b.name='b' and b.id<=2其结果分别为1和2。
因此最后的查询结果为:
这跟:
select id,name,的结果是一样的。