Образец SQL Server каждого типа записи - PullRequest
2 голосов
/ 22 февраля 2011

У меня есть таблица, полная записей для разных семестров, и я хочу, чтобы запрос выбрал 5 лучших строк в каждом семестре.

Я бы хотел, чтобы один набор результатов был отсортирован по ключевому полю (серийный номер) иодин набор результатов со случайными сортировками в каждом семестре.

Таблица выглядит следующим образом:

  • serial int
  • semester char (4)
  • оценкаint

Данные таблицы:

Semester|Serial|NewSerial
SP10    |1     |1001
SP10    |2     |1002
SP10    |3     |1003
SP10    |4     |1004
SP10    |5     |1005
SP10    |6     |1006
SP10    |7     |1007
SP10    |8     |1008
SP10    |9     |1009
SP10    |10    |1010
FA10    |1     |2001
FA10    |2     |2002
FA10    |3     |2003
FA10    |4     |2004
FA10    |5     |2005
FA10    |6     |2006
FA10    |7     |2007
FA10    |8     |2008
FA10    |9     |2009
FA10    |10    |2010
FA09    |1     |3001
FA09    |2     |3002
FA09    |3     |3003
FA09    |4     |3004
FA09    |5     |3005
FA09    |6     |3006
FA09    |7     |3007
FA09    |8     |3008
FA09    |9     |3009
FA09    |10    |3010

Результат 1: упорядочено по серийному номеру, top 5

Semester|Serial|NewSerial
SP10    |1     |1001
SP10    |2     |1002
SP10    |3     |1003
SP10    |4     |1004
SP10    |5     |1005
FA10    |1     |2001
FA10    |2     |2002
FA10    |3     |2003
FA10    |4     |2004
FA10    |5     |2005
FA09    |1     |3001
FA09    |2     |3002
FA09    |3     |3003
FA09    |4     |3004
FA09    |5     |3005

Результат 2: случайный порядок в течение семестра (выборка)

Semester|Serial|NewSerial
SP10    |3     |1003
SP10    |1     |1001
SP10    |5     |1005
SP10    |2     |1002
SP10    |4     |1004
FA10    |2     |2002
FA10    |1     |2001
FA10    |4     |2004
FA10    |3     |2003
FA10    |5     |2005
FA09    |3     |3003
FA09    |1     |3001
FA09    |2     |3002
FA09    |5     |3005
FA09    |4     |3004

Ответы [ 3 ]

5 голосов
/ 22 февраля 2011

это должно сделать это:

WITH [query_semester] AS (
    SELECT RN = ROW_NUMBER() OVER (PARTITION BY semester
    ORDER BY serial),
    serial, semester, grade
    FROM SemesterTable)
SELECT serial, semester, grade
FROM [query_semester] WHERE [RN] <= 5;

и случайный:

WITH [query_semester] AS (
    SELECT RN = ROW_NUMBER() OVER (PARTITION BY semester
    ORDER BY NEWID()),
    serial, semester, grade
    FROM SemesterTable)
SELECT serial, semester, grade
FROM [query_semester] WHERE [RN] <= 5;
0 голосов
/ 22 февраля 2011

Не знаю, какие критерии вы используете для создания нового сериала, но если его просто нужно последовательно увеличивать на семестр (в тысячной позиции), тогда

select semester, serial,
    newserial = (DENSE_RANK() over (order by semester) * 1000) + rn
from
(   select *, rn=ROW_NUMBER() over (partition by semester order by serial)
    from tbl
) x
where rn <= 5
order by semester

Для заказа по серийному номеру. Поменяйте order by serial на order by newid(), чтобы получить случайную выборку.

Примечания:

  1. SQL Server 2005+ на уровне совместимости 90 +
  2. Формула для newserial работает отлично, потому что в каждом семестре может быть только 5 предметов, поэтому проблем не будет

EDIT

Это кажется нелогичным в этом вопросе, но если newserial - это просто обычное поле (его не было в списке), то выбранная часть становится просто

select semester, serial, newserial
0 голосов
/ 22 февраля 2011

Покажите нам некоторые примерные данные и ожидаемые результаты.

Вам потребуется ВЫБРАТЬ ТОП 5. Также вам нужно будет GROUP BY по типу семестра (если это будет дата).

Вместо TOP 5 используйте счет HAVING ...

...