Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从sql中的一组数据中获取最中间的记录_Sql_Sql Server - Fatal编程技术网

如何从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

我尝试过的查询适用于>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),(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