Есть ли любое различие между GROUP BY и ОТЛИЧНО

Вы создали интересный пример, но вы не тестируете модель, которая фактически анализирует ситуацию, которую вы описываете как квазиделение. Когда вы говорите: «когда x1 = 1 и x2 = 1 (obs 3), данные всегда терпят неудачу». Вы подразумеваете необходимость использования термина взаимодействия в модели. Обратите внимание, что это приводит к «более интересному» результату:

> summary(glm(cbind(fail,nofail)~x1*x2,data=data,family=binomial))

Call:
glm(formula = cbind(fail, nofail) ~ x1 * x2, family = binomial, 
    data = data)

Deviance Residuals: 
[1]  0  0  0  0

Coefficients:
              Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.367e-17  1.414e-01   0.000        1
x1           2.675e-17  2.000e-01   0.000        1
x2           2.965e-17  2.000e-01   0.000        1
x1:x2        2.731e+01  5.169e+04   0.001        1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1.2429e+02  on 3  degrees of freedom
Residual deviance: 2.7538e-10  on 0  degrees of freedom
AIC: 25.257

Number of Fisher Scoring iterations: 22

Обычно, как правило, нужно очень подозревать бета-коэффициенты 2.731e + 01: коэффициент неявных коэффициентов i:

 > exp(2.731e+01)
[1] 725407933166

В этой рабочей среде действительно нет существенной разницы между Inf и 725,407,933,166.

290
задан Brettski 4 May 2018 в 12:19
поделиться

17 ответов

MusiGenesis' ответ является функционально корректным относительно Вашего вопроса, как указано; SQL Server достаточно умен, чтобы понять, что, если Вы используете "Группу" и не используете какие-либо агрегатные функции, тогда что Вы на самом деле имеете в виду, "Отлично" - и поэтому это генерирует план выполнения, как будто Вы просто использовали "Отличный".

Однако я думаю, что это важно для ответа Hank примечания также - бесцеремонное обращение "Группы" и "Отличный" могло привести к некоторым пагубным глюкам по линии, если Вы не осторожны. Это не совсем корректно, чтобы сказать, что это - "не вопрос об агрегатах", потому что Вы спрашиваете о функциональном различии между двумя ключевыми словами SQL-запроса, одно из которых , означал использоваться с агрегатами и один из которых не.

молоток А может работать для управления в винте иногда, но если у Вас есть удобная отвертка, почему беспокойство?

(в целях этой аналогии, Hammer : Screwdriver :: GroupBy : Distinct и screw => get list of unique values in a table column)

229
ответ дан brett rogers 23 November 2019 в 01:43
поделиться

Путем я всегда понимал, что случается так, что отличное использование совпадает с группировкой каждым полем, которое Вы выбрали в порядке, Вы выбрали их.

т.е.:

select distinct a, b, c from table;

совпадает с:

select a, b, c from table group by a, b, c
0
ответ дан Zenshai 23 November 2019 в 01:43
поделиться

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

Попытка, выбирающая два поля и, видит то, что происходит.

Группа предназначается, чтобы использоваться как это:

SELECT name, SUM(transaction) FROM myTbl GROUP BY name

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

1
ответ дан Chris Cudmore 23 November 2019 в 01:43
поделиться

От 'SQL язык' перспектива две конструкции эквивалентны и какой, который Вы выбираете, является одним из того выбора 'образа жизни', который все мы должны сделать. Я думаю, что существует хороший случай для ОТЛИЧНОГО, являющегося более явным (и поэтому более внимательно человеку, который наследует Ваш код и т.д.), но это не означает, что конструкция GROUP BY является недопустимым выбором.

я думаю, что этот 'GROUP BY для агрегатов', неправильный акцент. Народ должен знать, что функция множества (МАКС, МИН, КОЛИЧЕСТВО, и т.д.) может быть опущена так, чтобы они могли понять намерение кодера, когда это.

идеальный оптимизатор распознает эквивалентные конструкции SQL и будет всегда выбирать идеальный план соответственно. Для Вашего реального предпочтительного механизма SQL необходимо протестировать:)

пз отмечают, что положение ОТЛИЧНОГО ключевого слова в избранном пункте может привести к различным результатам, например, контрасту:

SELECT COUNT(DISTINCT C) FROM myTbl;

SELECT DISTINCT COUNT(C) FROM myTbl;
2
ответ дан onedaywhen 23 November 2019 в 01:43
поделиться

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

3
ответ дан Jeffrey L Whitledge 23 November 2019 в 01:43
поделиться

группа используется в совокупных операциях - как то, когда Вы хотите добраться, количество бакалавра наук, сломанного отличным столбцом C

select C, count(B) from myTbl group by C

, - то, на что это походит - Вы получаете уникальные строки.

В SQL-сервере 2005, похоже, что оптимизатор запросов в состоянии оптимизировать далеко различие в упрощенных примерах, которые я выполнил. Не знайте, можно ли рассчитывать на это во всех ситуациях, все же.

4
ответ дан Danimal 23 November 2019 в 01:43
поделиться

GROUP BY имеет очень определенное значение, которое отлично (heh) от ОТЛИЧНОЙ функции.

GROUP BY заставляет результаты запроса быть сгруппированными с помощью выбранного выражения, агрегатные функции могут тогда быть применены, и они будут действовать на каждую группу, а не весь набор результатов.

Вот пример, который мог бы помочь:

, Учитывая таблицу, которая похожа на это:

name
------
barry
dave
bill
dave
dave
barry
john

Этот запрос:

SELECT name, count(*) AS count FROM table GROUP BY name;

произведет вывод как это:

name    count
-------------
barry   2
dave    3
bill    1
john    1

, Который очевидно очень отличается от использования ОТЛИЧНОГО. Если Вы хотите сгруппировать свои результаты, используйте GROUP BY, если Вы просто хотите уникальный список определенного столбца, используйте ОТЛИЧНЫЙ. Это даст Вашей базе данных шанс оптимизировать запрос для Ваших потребностей.

5
ответ дан Dan 23 November 2019 в 01:43
поделиться

У них есть различная семантика, даже если у них, оказывается, есть эквивалентные результаты на Ваших конкретных данных.

11
ответ дан Hank Gay 23 November 2019 в 01:43
поделиться

Если Вы будете использовать ОТЛИЧНЫЙ с несколькими столбцами, набор результатов не будет сгруппирован, поскольку он будет с GROUP BY, и Вы не можете использовать агрегатные функции с ОТЛИЧНЫМ.

12
ответ дан Bill the Lizard 23 November 2019 в 01:43
поделиться

Для запроса Вы отправили, они идентичны. Но для других запросов, которые не могут быть верными.

, Например, это не то же как:

SELECT C FROM myTbl GROUP BY C, D
14
ответ дан Joel Coehoorn 23 November 2019 в 01:43
поделиться

Я ожидаю, что существует возможность для тонких различий в их выполнении. Я проверил планы выполнения относительно двух функционально эквивалентных запросов вдоль этих строк в Oracle 10 г:

core> select sta from zip group by sta;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH GROUP BY     |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

core> select distinct sta from zip;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH UNIQUE       |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

средняя операция немного отличается: "ХЕШИРУЙТЕ GROUP BY" по сравнению с "ХЕШЕМ, УНИКАЛЬНЫМ", но предполагаемые затраты и т.д. идентичны. Я тогда выполнил их с трассировкой на, и фактические операционные количества были тем же для обоих (за исключением того, что второй не должен был делать никаких физических чтений из-за кэширования).

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

я думаю, что необходимо предпочесть ОТЛИЧНЫЙ синтаксис с этой целью. Это не просто привычка, это более ясно указывает на цель запроса.

19
ответ дан Dave Costa 23 November 2019 в 01:43
поделиться

Используйте DISTINCT, если Вы просто хотите удалить дубликаты. Используйте GROUPY BY, если Вы хотите применить агрегатные операторы (MAX, SUM, GROUP_CONCAT..., или HAVING пункт).

32
ответ дан hims056 23 November 2019 в 01:43
поделиться

нет никакого различия (в SQL Server, по крайней мере). Оба запроса используют тот же план выполнения.

http://sqlmag.com/database-performance-tuning/distinct-vs-group

, Возможно, там различие, если существуют включенные подзапросы:

http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/

нет никакого различия (стиль Oracle):

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212

43
ответ дан MusiGenesis 23 November 2019 в 01:43
поделиться

GROUP BY позволяет Вам использовать агрегатные функции, как AVG, MAX, MIN, SUM, и COUNT. С другой стороны DISTINCT просто удаляет дубликаты.

, Например, если у Вас есть набор записей покупки, и Вы хотите знать, сколько было потрачено каждым отделом, Вы могли бы сделать что-то как:

SELECT department, SUM(amount) FROM purchases GROUP BY department

Это даст Вам одну строку на отдел, содержа название отдела и сумму всего из amount значения во всех строках для того отдела.

132
ответ дан mightybruno 23 November 2019 в 01:43
поделиться

Не используйте GROUP BY, когда Вы имеете в виду ОТЛИЧНЫЙ, даже если они, оказывается, работают то же. Я предполагаю, что Вы пытаетесь сбрить миллисекунды от запросов, и я должен указать, что время разработчика является порядками величины, более дорогими, чем машинное время.

6
ответ дан Andy Lester 23 November 2019 в 01:43
поделиться

Иногда они могут давать вам одинаковые результаты, но они предназначены для использования в другом смысле / случае. Основное отличие заключается в синтаксисе.

Обратите внимание на приведенный ниже пример. DISTINCT используется для фильтрации дублированного набора значений. (6, CS, 9,1) и (1, CS, 5,5) являются двумя различными наборами. Таким образом, DISTINCT будет отображать обе строки, в то время как GROUP BY Branch будет отображать только один набор.

 SELECT * FROM student; 
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    2 | mech   |  6.3 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    1 | cs     |  5.5 |
+------+--------+------+
5 rows in set (0.001 sec)

SELECT DISTINCT * FROM student; 
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    2 | mech   |  6.3 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    1 | cs     |  5.5 |
+------+--------+------+
5 rows in set (0.001 sec)

SELECT * FROM student GROUP BY Branch;
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    2 | mech   |  6.3 |
+------+--------+------+
4 rows in set (0.001 sec)

Иногда результаты, которые могут быть достигнуты с помощью пункта GROUP BY, не могут быть достигнуты с помощью DISTINCT без использования какого-либо дополнительного условия или условия. Например, в приведенном выше случае.

Чтобы получить тот же результат, что и DISTINCT, вы должны передать все имена столбцов в предложении GROUP BY, как показано ниже. Итак, посмотрите на синтаксическую разницу. Вы должны знать все имена столбцов, чтобы использовать предложение GROUP BY в этом случае.

SELECT * FROM student GROUP BY Id, Branch, CGPA;
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    1 | cs     |  5.5 |
|    2 | mech   |  6.3 |
|    3 | civil  |  7.2 |
|    4 | eee    |  8.2 |
|    6 | cs     |  9.1 |
+------+--------+------+

Также я заметил, что GROUP BY отображает результаты в порядке возрастания по умолчанию, чего нет в DISTINCT. Но я не уверен в этом. Это может отличаться от поставщика.

Источник: https://dbjpanda.me/dbms/languages/sql/sql-syntax-with-examples#group-by

0
ответ дан 23 November 2019 в 01:43
поделиться

С точки зрения использования GROUP BY используется для группировки тех строк, которые Вы хотите вычислить. ОТЛИЧНЫЙ не сделает никакого вычисления. Это не покажет дублирующихся строк.

я всегда использовал ОТЛИЧНЫЙ, если я хочу представить данные без дубликатов.

, Если я хочу сделать вычисления как подведение итогов общего количества манго, я буду использовать GROUP BY

1
ответ дан 23 November 2019 в 01:43
поделиться
Другие вопросы по тегам:

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