@@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ, SCOPE_IDENTITY (), ВЫВОД и другие методы получения последних идентификационных данных

Я не думаю, что есть способ на самом деле использовать и summarise, и summarise_at, поскольку ясно, что мы не сможем выполнить второй после потери множества строк и столбцов.

Таким образом, вместо этого мы можем использовать mutate, mutate_at, а затем отбрасывать определенные строки (и, возможно, столбцы). Разница между этим и каким-то магическим применением summarise и summarise_at заключается в том, что первый подход не будет сбрасывать какие-либо переменные. Я думаю, это зависит от того, хорошо ли это для вас. Ниже я добавляю дополнительную строку select(-one_of(setdiff(names(zed), "team"))), которая на самом деле удалит все столбцы, которые будут отбрасываться суммирующим списком.

zed$zonenumber2 <- zed$zonenumber # Example
zed %>%
  group_by(team) %>%
  mutate(
    shotsMade = sum(result == "twopointmade"),
    shotsAtt = n(),
    shotsPct = round(shotsMade / shotsAtt),
    points = 2 * shotsMade) %>%
  mutate_at(
    vars(contains("zone")), 
    .funs = funs(Made1 = sum(. == 1), Made2 = sum(. == 2),
                 Made3 = sum(. == 3), Made4 = sum(. == 4))) %>%
  filter(!duplicated(team)) %>%
  select(-one_of(setdiff(names(zed), "team"))) # May want to remove
# A tibble: 2 x 13
# Groups:   team [2]
#   team  shotsMade shotsAtt shotsPct points zonenumber_Made1 zonenumber2_Mad… zonenumber_Made2
#   <chr>     <int>    <int>    <dbl>  <dbl>            <int>            <int>            <int>
# 1 Bos           7       10        1     14                4                4                3
# 2 Min           4       10        0      8                2                2                2
# … with 5 more variables: zonenumber2_Made2 <int>, zonenumber_Made3 <int>,
#   zonenumber2_Made3 <int>, zonenumber_Made4 <int>, zonenumber2_Made4 <int>
59
задан gotqn 30 March 2015 в 11:55
поделиться

7 ответов

Это зависит от того, что Вы пытаетесь сделать...

@@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ

Возвращают последнее значение ИДЕНТИФИКАЦИОННЫХ ДАННЫХ, произведенное на соединении, независимо от таблицы, которая произвела значение, и независимо от объема оператора, который произвел значение. @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ возвратят последнее значение идентификационных данных, ввел в таблицу на Вашей текущей сессии. @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ ограничены текущей сессией и не ограничены текущей областью. Например, если у Вас будет триггер на таблице, которая заставляет идентификационные данные быть созданными в другой таблице, то Вы получите идентификационные данные, которые были созданы в последний раз, даже если это был триггер, который создал его.

SCOPE_IDENTITY ()

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

IDENT_CURRENT ()

Возвращает последнее значение ИДЕНТИФИКАЦИОННЫХ ДАННЫХ, произведенное в таблице, независимо от соединения и объема оператора, который произвел значение. IDENT_CURRENT ограничен указанной таблицей, но не соединением или объемом.

74
ответ дан mson 24 November 2019 в 18:22
поделиться

@@ Идентификационные данные являются старым школьным путем. Используйте SCOPE_IDENTITY () во всем продвижении экземпляров. См. MSDN для последствий использования @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ (они плохи!).

6
ответ дан jcollum 24 November 2019 в 18:22
поделиться

Существует другой метод, доступный в SQL Server 2005, который обрисован в общих чертах в SQL в Дикой природе .

Это позволит Вам получать несколько идентификационных данных после того, как вставят. Вот код от сообщения в блоге:

Create Table #Testing (  
    id int identity,  
    somedate datetime default getdate()  
)  
insert into #Testing  
output inserted.*  
default values
3
ответ дан Seibar 24 November 2019 в 18:22
поделиться

Маленькое исправление к ответу Godeke:

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

Другое голосование за scope_identity...

3
ответ дан Paul Sasik 24 November 2019 в 18:22
поделиться

SCOPE_IDENTITY достаточен для единственных строк и рекомендуется кроме случаев, где необходимо видеть результат промежуточного ТРИГГЕРА по некоторым причинам (почему?).

Для нескольких строк, которые ПРОИЗВОДЯТ/ПРОИЗВОДЯТ В, Ваш новый лучший друг и альтернатива перенахождению строк и вставке в другую таблицу.

4
ответ дан Cade Roux 24 November 2019 в 18:22
поделиться

Обратите внимание, что есть ошибка в scope_identity () и @@ identity - см. MS Connect: https: // connect. microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811

Цитата (от Microsoft):

Я настоятельно рекомендую использовать OUTPUT вместо @@ IDENTITY в любом случае. Это просто лучший способ прочитать личность и временную метку.

Отредактировано для добавления: теперь это может быть исправлено. Connect выдает ошибку, но см.:

Scope_Identity (), возвращающий неверное значение, исправлено?

12
ответ дан 24 November 2019 в 18:22
поделиться

Будьте осторожны при использовании @@ IDENTITY ...

http://dotnetgalactics.wordpress.com/2009/10/28/scope-identity-vs-identity/

1
ответ дан 24 November 2019 в 18:22
поделиться
Другие вопросы по тегам:

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