Что означает PARTITION BY 1? - PullRequest
4 голосов
/ 26 июля 2010

Для пары курсоров, где общее количество строк в наборе результатов требуется сразу после первого FETCH (после некоторой проб и ошибок), я предложил запрос ниже

SELECT
 col_a,
 col_b,
 col_c,
 COUNT(*) OVER( PARTITION BY 1 ) AS rows_in_result
FROM 
 myTable JOIN theirTable ON
 myTable.col_a = theirTable.col_z
GROUP BY
 col_a, col_b, col_c
ORDER BY 
 col_b

Теперь, когда результатом запроса является X строк, row_in_result это точно отражает.

  • Что означает PARTITION BY 1?
    • Я думаю это, вероятно, говорит базе данных разбить результаты на части по 1 строке

Ответы [ 2 ]

9 голосов
/ 27 июля 2010

Это необычное использование PARTITION BY.Все, что он делает - это помещает все в один и тот же раздел, так что если запрос возвращает 123 строки в целом, то значение row_in_result для каждой строки будет равно 123 (как следует из псевдонима).более кратко:

COUNT(*) OVER ()
1 голос
/ 03 декабря 2012

Базы данных могут свободно добавлять ограничения к предложению OVER(). Иногда PARTITION BY [...] и / или ORDER BY [...] являются обязательными предложениями, в зависимости от функции агрегирования. PARTITION BY 1 может быть просто фиктивным предложением, используемым для целостности синтаксиса. Следующие два обычно эквивалентны:

[aggregate function] OVER ()
[aggregate function] OVER (PARTITION BY 1)

Обратите внимание, что Sybase SQL Anywhere и CUBRID интерпретируют этот 1 как ссылку на индекс столбца, аналогично тому, что возможно в предложении ORDER BY [...]. Это может показаться немного удивительным, поскольку навязывает порядок оценки проекции запроса. В вашем случае это будет тогда означать, что следующее эквивалентно

COUNT(*) OVER (PARTITION BY 1)
COUNT(*) OVER (PARTITION BY col_a)

Это любопытное отклонение от интерпретации других баз данных позволяет ссылаться на более сложные выражения группировки.

...