如何从sql中的一组数据中获取最中间的记录

时间:2015-12-14 12:04:49

标签: sql sql-server

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)) 

我试过的查询工作&gt; 4条记录但不适用于&#39; 3&#39;。现在我的问题是我应该如何修改我的查询以便3条记录我应该得到第2条记录,这是中间的其中大多数记录,尝试从上述记录中仅插入3条记录并提供帮助。提前谢谢。

3 个答案:

答案 0 :(得分:3)

有很多方法可以获得SQL的中位数。这是一个简单的方法:

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);

对于偶数个记录,您将获得两行。在这种情况下,你需要决定你真正想要的是什么。

答案 1 :(得分:2)

这个怎么样:

**已编辑

;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) 

答案 2 :(得分:2)

您可以使用OFFSET和FETCH

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