Подсчет ОТЛИЧНОГО по нескольким столбцам

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

http://www.jslint.com/

, который я должен изучить, это - модель расширяемости больше.

182
задан Jeff 28 March 2016 в 16:54
поделиться

7 ответов

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

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

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

65
ответ дан 23 November 2019 в 06:07
поделиться

Надеюсь, что это сработает, я пишу на prima vista

SELECT COUNT(*) 
FROM DocumentOutputItems 
GROUP BY DocumentId, DocumentSessionId
2
ответ дан 23 November 2019 в 06:07
поделиться

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

WITH internalQuery (Amount)
AS
(
    SELECT (0)
      FROM DocumentOutputItems
  GROUP BY DocumentId, DocumentSessionId
)
SELECT COUNT(*) AS NumberOfDistinctRows
  FROM internalQuery
3
ответ дан 23 November 2019 в 06:07
поделиться

Вот более короткая версия без подзапроса:

7
ответ дан 23 November 2019 в 06:07
поделиться

Как насчет чего-то вроде:

select count(*)
from
  (select count(*) cnt
   from DocumentOutputItems
   group by DocumentId, DocumentSessionId) t1

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

14
ответ дан 23 November 2019 в 06:07
поделиться

, если у вас было только одно поле для «DISTINCT», вы могли бы использовать:

SELECT COUNT(DISTINCT DocumentId) 
FROM DocumentOutputItems

, и это действительно возвращает тот же план запроса, что и исходный, как проверено с помощью SET SHOWPLAN_ALL ON. Однако вы используете два поля, поэтому вы можете попробовать что-нибудь безумное, например:

    SELECT COUNT(DISTINCT convert(varchar(15),DocumentId)+'|~|'+convert(varchar(15), DocumentSessionId)) 
    FROM DocumentOutputItems

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

2
ответ дан 23 November 2019 в 06:07
поделиться

Что вам не нравится в существующем запросе? Если вас беспокоит, что DISTINCT в двух столбцах не возвращает только уникальные перестановки, почему бы не попробовать?

Это определенно работает в Oracle, как и следовало ожидать.

SQL> select distinct deptno, job from emp
  2  order by deptno, job
  3  /

    DEPTNO JOB
---------- ---------
        10 CLERK
        10 MANAGER
        10 PRESIDENT
        20 ANALYST
        20 CLERK
        20 MANAGER
        30 CLERK
        30 MANAGER
        30 SALESMAN

9 rows selected.


SQL> select count(*) from (
  2  select distinct deptno, job from emp
  3  )
  4  /

  COUNT(*)
----------
         9

SQL>

править

Я пошел в тупик с аналитикой, но ответ был удручающе очевидным ...

SQL> select count(distinct concat(deptno,job)) from emp
  2  /

COUNT(DISTINCTCONCAT(DEPTNO,JOB))
---------------------------------
                                9

SQL>

править 2

Учитывая следующие данные, Приведенное выше решение конкатенации приведет к неправильному подсчету:

col1  col2
----  ----
A     AA
AA    A

Итак, мы должны включить разделитель ...

select col1 + '*' + col2 from t23
/

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

28
ответ дан 23 November 2019 в 06:07
поделиться