2015-12-14 4 views
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)) 

Запрос, который я пробовал, работает> 4 записи, но не для '3'. Теперь мой вопрос заключается в том, как мне изменить свой запрос так, что для 3-х записей я должен получить вторую запись, которая является самой средней среди них, попробуйте вставить только 3 записи из предыдущих записей и справки. Заранее спасибо.Как получить среднее большинство записей из группы данных в sql

ответ

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 
+0

Это именно то, что я искал. Работает и для <4 записей, которые удовлетворяют моему вопросу. Большой !! –

+0

@Shinchan_Shiro, если это ответит на ваш вопрос, вы должны его принять! –

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

Для четного количества записей вы получите две строки. В этом случае вам нужно решить, что вы на самом деле хотите.

+0

Спасибо у @gordon, тот полезно !! –

2

Как об этом:

** EDITED

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

Я предполагаю получить 5-ю и 6-ю записи для count = 10, но выше запрос дает только пятую запись. вы можете проверить и помочь. –

Смежные вопросы