Лучший способ рассчитать медиану в Access 2007 при использовании Group By - PullRequest
3 голосов
/ 12 марта 2009

У меня есть таблица с книгой и несколькими ценами на книгу (это очень упрощенный пример):

ID  BOOK    PRICE
1   BOOK1   10
2   BOOK1   15
3   BOOK1   12
4   BOOK2   8
5   BOOK2   2

Я легко вычисляю среднее значение, но должен быть хороший способ рассчитать медиану?

Текущий SQL:

SELECT DISTINCTROW Books.BOOK, Avg(Books.PRICE) AS [Avg Of PRICE]
FROM Books
GROUP BY Books.BOOK;

Результаты:

BOOK    Avg Of PRICE
BOOK1   12.3333333333333
BOOK2   5

Ответы [ 4 ]

3 голосов
/ 12 марта 2009

Медиана в Jet SQL отсутствует, если только она не была добавлена ​​в 2007 году, но здесь есть идея, как ее получить. Вам понадобится ...

Немного SQL ...

SELECT Statistics.Month, Sum(([SentTo])) AS [Sum Sent], fMedian("Statistics","Month",[Month],"SentTo") AS [Median Sent]
FROM Statistics
GROUP BY Statistics.Month;

И пользовательская функция (UDF).

Function fMedian(SQLOrTable, GroupFieldName, GroupFieldValue, MedianFieldName)
Dim rs As DAO.Recordset

Set db = CurrentDb
Set rs1 = db.OpenRecordset(SQLOrTable, dbOpenDynaset)

If IsDate(GroupFieldValue) Then
    GroupFieldValue = "#" & GroupFieldValue & "#"
ElseIf Not IsNumeric(GroupFieldValue) Then
    GroupFieldValue = "'" & Replace(GroupFieldValue, "'", "''") & "'"
End If

rs1.Filter = GroupFieldName & "=" & GroupFieldValue
rs1.Sort = MedianFieldName

Set rs = rs1.OpenRecordset()
rs.Move (rs.RecordCount / 2)

If rs.RecordCount Mod 2 = 0 Then
    varMedian1 = rs.Fields(MedianFieldName)
    rs.MoveNext
    fMedian = (varMedian1 + rs.Fields(MedianFieldName)) / 2
Else
    fMedian = rs.Fields(MedianFieldName)
End If

End Function

От: LessThanDot Wiki

1 голос
/ 04 марта 2010

Медиана может быть рассчитана в MS Access с использованием только обычных запросов и без VBA. Медиана - это 50-й процентиль. Итак, создавайте запросы на выборку нормально; затем перейдите в представление SQL и включите «Топ 50 процентов» после ключевого слова выбора. Сортировка по возрастанию для нижних 50 процентов; сортировка по убыванию в топ 50 процентов. Затем найдите максимальный нижний процентный набор результатов и минимальный верхний процентный набор результатов. Среднее из этих двух является медианой. При использовании «Топ 50 процентов» убедитесь, что критерии в запросе специфичны для того набора результатов, из которого будет рассчитываться медиана.

0 голосов
/ 05 апреля 2019

Я пытался использовать не-VBA методы, и все они несколько ограничены и не в состоянии дать вам самый точный результат для большего набора данных. Для метода Top 50 Perc Asc (Max) и Top 50 Perc Desc (Min) у Access есть ограничение, и он упускает отдельные значения при упорядочении в порядке возрастания. Для округления Access использует округление банкиров, поэтому оно не всегда округляется в зависимости от самого значения, вам нужно добавить конечное значение + -0,00001, если вы хотите округлить вверх или вниз. Я также попробовал другой метод Rank () без VBA, и у Access возникли проблемы с ранжированием значений, в которых есть хотя бы одна пара идентичных значений. По причинам, изложенным выше, я настоятельно рекомендую придерживаться создания функции настройки в VBA.

0 голосов
/ 12 марта 2009

Встроенной функции нет - поэтому вы должны использовать код для циклического просмотра записей и вычисления медианы самостоятельно.

Используйте google - там много примеров кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...