Так что это мое предложение для решения.
library(dplyr)
library(reshape2)
mtcars %>%
select(vs, am, cyl) %>%
table() %>%
apply(3, chisq.test) %>%
lapply(`[`, c(6,9)) %>%
melt() %>%
spread(key = L2, value = value) %>%
rename(cyl = L1) %>%
select(cyl, vs, am, observed, stdres) %>%
arrange(cyl)
cyl vs am observed stdres
1 4 0 0 0 -0.6422616
2 4 0 1 1 0.6422616
3 4 1 0 3 0.6422616
4 4 1 1 7 -0.6422616
5 6 0 0 0 -2.6457513
6 6 0 1 3 2.6457513
7 6 1 0 4 2.6457513
8 6 1 1 0 -2.6457513
9 8 0 0 12 NaN
10 8 0 1 2 NaN
11 8 1 0 0 NaN
12 8 1 1 0 NaN
Это делает тест хи-квадрат для каждой группы из cyl
. Группировка выполняется неявно в операторе select()
. В конце вы получите наблюдаемые значения и стандартизированные остатки для каждой комбинации cyl
, vs
, am
. Должно быть применимо к любому фрейму данных.
Надеюсь, это то, что вы искали.
Нет никакого точного совпадения.
Эквивалентом являются ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ, которые можно установить как тип данных при составлении таблицы. SQLSERVER автоматически создаст рабочий порядковый номер во время вставки. Последнее вставленное значение может быть получено путем вызова SCOPE_IDENTITY () или путем консалтинга с системной переменной @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ (как указано Frans)
При необходимости в точном эквиваленте необходимо было бы составить таблицу и затем записать процедуру для перенастройки следующего значения и других операций. Посмотрите отмечает ответ на ловушках на этом.
Править:
SQL Server реализовал Последовательность, подобную Oracle. См. этот вопрос для получения дополнительной информации.
Как Вы реализовали бы последовательности в Microsoft SQL Server?
сделайте поле полем Identity. Поле получит свое значение автоматически. Можно получить последнее вставленное значение путем вызова SCOPE_IDENTITY () или путем консалтинга с системной переменной @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ
SCOPE_IDENTITY () функция предпочтен.
Поскольку DHeer, сказанный там, не является абсолютно никаким точным совпадением. При попытке создать свою собственную процедуру, чтобы сделать это, то Вы будете неизменно мешать своему приложению масштабироваться.
Последовательности Oracle являются хорошо масштабируемыми.
Хорошо, я забираю его немного. Если Вы действительно готовы сфокусироваться на параллелизме, и Вы готовы взять числа не в порядке, как возможно с последовательностью, у Вас есть шанс. Но так как Вы кажетесь довольно незнакомыми с t-sql для начала, я начал бы искать некоторые другие опции когда (портирование приложения Oracle к MSSS - является этим, что Вы делаете),
Например, просто генерируйте GUID в функции "nextval". Это масштабировалось бы.
О, и НЕ используйте таблицу для всех значений, только для сохранения макс. значения в кэше. Необходимо было бы заблокировать его, чтобы гарантировать, чтобы Вы дали уникальные значения, и это - то, где Вы прекратите масштабироваться. Необходимо будет выяснить, существует ли способ кэшировать значения в памяти и программном доступе к своего рода легким блокировкам - блокировки памяти, не блокировки таблицы.
Мне жаль, что SQL Server не имел эту функцию. Это сделало бы столько вещей легче.
Вот то, как я обошел это.
Составьте таблицу, названную tblIdentities. В этой таблице помещает строку с Вашей минутой и макс. значениями и как часто Порядковый номер должен быть сброшен. Также поставьте имя новой таблицы (назовите его tblMySeqNum). Выполнение этого делает добавление большего количества генераторов Порядкового номера позже довольно легким.
tblMySeqNum имеет два столбца. Идентификатор (который является международными идентификационными данными) и InsertDate (который является столбцом времени даты со значением по умолчанию GetDate ()).
При необходимости в новой seq цифре назовите sproc, который вставляет в эту таблицу, и используйте SCOPE_IDENTITY () для создавания идентификационных данных. Удостоверьтесь, что Вы не превысили макс. в tblIdentities. Если Вы имеете, затем возвращают ошибку. Если не возвращают Ваш Порядковый номер.
Теперь, чтобы сбросить и вымыться. Имейте задание, которое работает как регулярно по мере необходимости, который проверяет все таблицы, перечисленные в tblIdentites (всего один на данный момент), чтобы видеть, должны ли они быть сброшены. Если они поразили значение сброса или время, то звоните, DBCC IDENT ПЕРЕСЕВАЮТ на названии таблицы, перечисленной в строке (tblMySeqNum в этом примере). Это - также хорошее время для очистки нашего дополнительные строки, в которых Вы действительно не нуждаетесь в той таблице.
Не делайте очистки или пересевающий в Вашем sproc, который получает идентификационные данные. Если Вы сделаете затем, то Ваш генератор порядкового номера не масштабируется хорошо вообще.
Как я сказал, это сделает столько вещей легче из этой функции, был в SQL Server, но я нашел что эта работа вокруг функций довольно хорошо.
Vaccano
На этот вопрос, возможно, уже давным-давно ответили ... но начиная с SQL 2005 и далее вы можете использовать функцию ROW_NUMBER
... пример:
select ROW_NUMBER() OVER (ORDER BY productID) as DynamicRowNumber, xxxxxx,xxxxx
Оператор OVER
использует ORDER BY
для уникального первичного ключа в моем случае ...
Надеюсь, это поможет ... больше никаких временных таблиц или странных объединений !!
Идентификация - лучшее и наиболее масштабируемое решение, НО, если вам нужна последовательность, которая не является увеличивающимся целым числом, например 00A, 00B, 00C или какой-либо специальной последовательностью, существует вторая - лучший способ. При правильной реализации он масштабируется нормально, но при плохой реализации плохо масштабируется. Я не решаюсь рекомендовать это, но вы делаете следующее:
Специальный синтаксис обновления немного зависит от версии, но суть заключается в том, что вы выполняете присвоение переменной и обновление в то же заявление. На 2008 год у Ицика Бен-Гана есть это изящное решение: http: //www.sqlmag. - измените хвостовую часть на свою логику приращения.
Это будет увеличивать и возвращать вам следующее значение.
Если у вас абсолютно не может быть пропусков (сопротивляйтесь этому требованию :-), то технически возможно установить это обновление или proc в остальной части вашего транзакции, но вы получаете БОЛЬШОЙ результат параллелизма, поскольку каждая вставка ожидает фиксации предыдущей.
Я не могу поверить в это; Я всему этому научился у Ицика.