如何从sql中的一组数据中获取最中间的记录
我尝试过的查询适用于>4条记录,但不适用于“3”。现在我的问题是,我应该如何修改我的查询,以便对于3条记录,我应该获得第二条记录,这是其中最中间的记录,请尝试仅插入上述记录中的3条记录并提供帮助。提前感谢。在SQL中,有很多方法可以获得中间值。这里有一个简单的方法:如何从sql中的一组数据中获取最中间的记录,sql,sql-server,Sql,Sql Server,我尝试过的查询适用于>4条记录,但不适用于“3”。现在我的问题是,我应该如何修改我的查询,以便对于3条记录,我应该获得第二条记录,这是其中最中间的记录,请尝试仅插入上述记录中的3条记录并提供帮助。提前感谢。在SQL中,有很多方法可以获得中间值。这里有一个简单的方法: create table #middle ( A INT, B INT, C INT ) INSERT INTO #middle (A,B,C) VALUES (7,6,2),(1,0,8),(9,12,16),(7, 16, 2
create table #middle
(
A INT,
B INT,
C INT
)
INSERT INTO #middle (A,B,C) VALUES (7,6,2),(1,0,8),(9,12,16),(7, 16, 2),(1,12,8), (9,12,16),(9,12,16),(7, 16, 2),(1,12,8), (9,12,16)
;WITH MIDS
AS (SELECT *,
Row_number()
OVER (
ORDER BY a, b, c DESC )AS rn
FROM #middle)
SELECT *
FROM MIDS
WHERE rn <= (SELECT CASE ( Count(*)%2 )
WHEN 0 THEN ( Count(*) / 2 ) + 1
ELSE ( Count(*) / 2 )
END
FROM MIDS) except (SELECT *
FROM MIDS
WHERE rn < (SELECT ( Count(*) / 2 )
FROM MIDS))
对于偶数个记录,您将得到两行。在这种情况下,你需要决定你真正想要什么。这个怎么样:
**编辑
select h.*
from (select h.*, row_number() over (order by a, b, c desc) as seqnum,
count(*) over () as cnt
from #highest h
) h
where 2 * rn in (cnt, cnt - 1, cnt + 1);
您可以使用OFFSET和FETCH
;WITH MIDS
AS (SELECT *,
Row_number()
OVER (
ORDER BY a, b, c DESC )AS rn
FROM #middle),
Cnt
AS
(SELECT COUNT(*) c, COUNT(*)%2 as rem, COUNT(*)/2 as mid FROM Mids)
SELECT *
FROM MIDS
CROSS APPLY cnt
where (rn >= cnt.mid and rn <= cnt.mid + 1 AND cnt.rem = 0) OR
(cnt.rem <> 0 AND rn = cnt.mid+1)
谢谢你,戈登,这很有帮助!!这正是我想要的。为@Shinchan_Shiro工作如果这回答了你的问题,你应该接受它!我假设得到count=10的第五条和第六条记录,但上面的查询只给出了第五条记录。你能帮我查一下吗。
select *
from #middle
order by a, b, c desc
offset (select count(*) / 2 - (case when count(*) % 2 = 0 then 1 else 0 end) from #middle) rows
fetch next (select 2 - (count(*) % 2) from #middle) rows only