Последовательность Oracle, но затем в SQL Server MS

Так что это мое предложение для решения.

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. Должно быть применимо к любому фрейму данных.

Надеюсь, это то, что вы искали.

14
задан Xinus 28 April 2010 в 14:50
поделиться

6 ответов

Нет никакого точного совпадения.

Эквивалентом являются ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ, которые можно установить как тип данных при составлении таблицы. SQLSERVER автоматически создаст рабочий порядковый номер во время вставки. Последнее вставленное значение может быть получено путем вызова SCOPE_IDENTITY () или путем консалтинга с системной переменной @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ (как указано Frans)

При необходимости в точном эквиваленте необходимо было бы составить таблицу и затем записать процедуру для перенастройки следующего значения и других операций. Посмотрите отмечает ответ на ловушках на этом.

Править:
SQL Server реализовал Последовательность, подобную Oracle. См. этот вопрос для получения дополнительной информации.

Как Вы реализовали бы последовательности в Microsoft SQL Server?

15
ответ дан 1 December 2019 в 08:43
поделиться

сделайте поле полем Identity. Поле получит свое значение автоматически. Можно получить последнее вставленное значение путем вызова SCOPE_IDENTITY () или путем консалтинга с системной переменной @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ

SCOPE_IDENTITY () функция предпочтен.

5
ответ дан 1 December 2019 в 08:43
поделиться

Поскольку DHeer, сказанный там, не является абсолютно никаким точным совпадением. При попытке создать свою собственную процедуру, чтобы сделать это, то Вы будете неизменно мешать своему приложению масштабироваться.

Последовательности Oracle являются хорошо масштабируемыми.

Хорошо, я забираю его немного. Если Вы действительно готовы сфокусироваться на параллелизме, и Вы готовы взять числа не в порядке, как возможно с последовательностью, у Вас есть шанс. Но так как Вы кажетесь довольно незнакомыми с t-sql для начала, я начал бы искать некоторые другие опции когда (портирование приложения Oracle к MSSS - является этим, что Вы делаете),

Например, просто генерируйте GUID в функции "nextval". Это масштабировалось бы.

О, и НЕ используйте таблицу для всех значений, только для сохранения макс. значения в кэше. Необходимо было бы заблокировать его, чтобы гарантировать, чтобы Вы дали уникальные значения, и это - то, где Вы прекратите масштабироваться. Необходимо будет выяснить, существует ли способ кэшировать значения в памяти и программном доступе к своего рода легким блокировкам - блокировки памяти, не блокировки таблицы.

3
ответ дан 1 December 2019 в 08:43
поделиться

Мне жаль, что SQL Server не имел эту функцию. Это сделало бы столько вещей легче.

Вот то, как я обошел это.

Составьте таблицу, названную tblIdentities. В этой таблице помещает строку с Вашей минутой и макс. значениями и как часто Порядковый номер должен быть сброшен. Также поставьте имя новой таблицы (назовите его tblMySeqNum). Выполнение этого делает добавление большего количества генераторов Порядкового номера позже довольно легким.

tblMySeqNum имеет два столбца. Идентификатор (который является международными идентификационными данными) и InsertDate (который является столбцом времени даты со значением по умолчанию GetDate ()).

При необходимости в новой seq цифре назовите sproc, который вставляет в эту таблицу, и используйте SCOPE_IDENTITY () для создавания идентификационных данных. Удостоверьтесь, что Вы не превысили макс. в tblIdentities. Если Вы имеете, затем возвращают ошибку. Если не возвращают Ваш Порядковый номер.

Теперь, чтобы сбросить и вымыться. Имейте задание, которое работает как регулярно по мере необходимости, который проверяет все таблицы, перечисленные в tblIdentites (всего один на данный момент), чтобы видеть, должны ли они быть сброшены. Если они поразили значение сброса или время, то звоните, DBCC IDENT ПЕРЕСЕВАЮТ на названии таблицы, перечисленной в строке (tblMySeqNum в этом примере). Это - также хорошее время для очистки нашего дополнительные строки, в которых Вы действительно не нуждаетесь в той таблице.

Не делайте очистки или пересевающий в Вашем sproc, который получает идентификационные данные. Если Вы сделаете затем, то Ваш генератор порядкового номера не масштабируется хорошо вообще.

Как я сказал, это сделает столько вещей легче из этой функции, был в SQL Server, но я нашел что эта работа вокруг функций довольно хорошо.

Vaccano

1
ответ дан 1 December 2019 в 08:43
поделиться

На этот вопрос, возможно, уже давным-давно ответили ... но начиная с SQL 2005 и далее вы можете использовать функцию ROW_NUMBER ... пример:

select ROW_NUMBER() OVER (ORDER BY productID) as DynamicRowNumber, xxxxxx,xxxxx

Оператор OVER использует ORDER BY для уникального первичного ключа в моем случае ...

Надеюсь, это поможет ... больше никаких временных таблиц или странных объединений !!

1
ответ дан 1 December 2019 в 08:43
поделиться

Идентификация - лучшее и наиболее масштабируемое решение, НО, если вам нужна последовательность, которая не является увеличивающимся целым числом, например 00A, 00B, 00C или какой-либо специальной последовательностью, существует вторая - лучший способ. При правильной реализации он масштабируется нормально, но при плохой реализации плохо масштабируется. Я не решаюсь рекомендовать это, но вы делаете следующее:

  1. Вы должны сохранить «следующее значение» в таблице. Таблица может быть простой таблицей с одной строкой и одним столбцом, содержащей только это значение. Если у вас несколько последовательностей, они могут использовать одну и ту же таблицу, но вы можете снизить конкуренцию, если для каждой будут отдельные таблицы.
  2. Вам нужно написать один оператор обновления, который увеличит это значение на 1 интервал. Вы можете поместить обновление в сохраненный процесс, чтобы упростить его использование и предотвратить его повторение в коде в разных местах.
  3. Правильно используя последовательность, для разумного масштабирования (нет, не так хорошо, как Identitiy :-), требуется две вещи: a. оператор обновления имеет специальный синтаксис, созданный для этой конкретной проблемы, который будет увеличивать и возвращать значение в одном операторе; б. вы должны получить значение из настраиваемой последовательности ДО начала транзакции и за пределами области транзакции. Это одна из причин, по которой Identity масштабируется - она ​​возвращает новое значение независимо от области транзакции для любой попытки вставить , но не откатывается при неудаче. Это означает, что он не будет блокироваться, а также означает, что у вас будут пробелы для неудачных транзакций.

Специальный синтаксис обновления немного зависит от версии, но суть заключается в том, что вы выполняете присвоение переменной и обновление в то же заявление. На 2008 год у Ицика Бен-Гана есть это изящное решение: http: //www.sqlmag. - измените хвостовую часть на свою логику приращения.

Это будет увеличивать и возвращать вам следующее значение.

Если у вас абсолютно не может быть пропусков (сопротивляйтесь этому требованию :-), то технически возможно установить это обновление или proc в остальной части вашего транзакции, но вы получаете БОЛЬШОЙ результат параллелизма, поскольку каждая вставка ожидает фиксации предыдущей.

Я не могу поверить в это; Я всему этому научился у Ицика.

6
ответ дан 1 December 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: