Aplicación de la función MIN aggregate a un campo de BITS


Quiero escribir la siguiente consulta:

SELECT   ..., MIN(SomeBitField), ...
FROM     ...
WHERE    ...
GROUP BY ...

El problema es que a SQL Server no le gusta, cuando quiero calcular el valor mínimo de un campo de bits devuelve el error Operand data type bit is invalid for min operator.

Podría usar la siguiente solución:

SELECT   ..., CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), ...
FROM     ...
WHERE    ...
GROUP BY ...

Pero, ¿hay algo más elegante? (Por ejemplo, podría haber una función agregada, que no conozco, y que evalúa el and lógico de los valores de bits en un campo.)

Author: pyon, 2011-08-09

7 answers

Dado que solo hay dos opciones para BIT, simplemente use una instrucción case:

SELECT CASE WHEN EXISTS (SELECT 1 FROM ....) THEN 1 ELSE 0 END AS 'MinBit'
FROM ...
WHERE ...

Esto tiene la ventaja de:

  • No forzar un escaneo de tabla (los índices en los campos BIT casi nunca se usan)
  • Cortocircuito DOS VECES (una vez para EXISTS y otra vez para el CASE)

Es un poco más de código para escribir, pero no debería ser terrible. Si tiene varios valores para verificar, siempre podría encapsular su conjunto de resultados más grande (con todos los JOIN y FILTER criteria) en un CTE al principio de la consulta, luego haga referencia a eso en las sentencias CASE.

 30
Author: JNK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-09 14:59:16

Una opción es MIN(SomeBitField+0). Se lee bien, con menos ruido (lo que calificaría como elegancia).

Dicho esto, es más hack-ish que la opción CASE. Y no se nada sobre velocidad / eficiencia.

 110
Author: Ben Mosher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-17 15:04:16

Intente lo siguiente Nota: Min representar Y función agregada, Max representar O función agregada

SELECT   ..., MIN(case when SomeBitField=1 then 1 else 0 end), MIN(SomeBitField+0)...
FROM     ...
WHERE    ...
GROUP BY ...

Mismo resultado

 6
Author: Waleed A.K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-25 19:03:19

Esta consulta es la mejor solución:

SELECT CASE WHEN MIN(BitField+0) = 1 THEN 'True' ELSE 'False' END AS MyColumn
 FROM MyTable

Cuando se agrega el BitField + 0 automáticamente se convierte en int

 4
Author: Israel Margulies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-15 14:31:23
select min(convert(int, somebitfield))

O si desea mantener el resultado como bit

select convert(bit, min(convert(int, somebitfield)))
 3
Author: Verard Sloggett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-07 21:46:55

AVG(CAST (boolean_column COMO FLOAT)) OVER (...) COMO BOOLEAN_AGGREGATE

Dar un booleano borroso:

  • 1 indica que todo eso es Cierto;

  • 0 indica que todo eso es falso;

  • Un valor entre 0..1 [indicar coincidencia parcial y puede ser algún porcentaje de verdad.

 2
Author: user7370003,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-06 10:58:16

Esta pequeña pieza de código siempre ha funcionado conmigo como un encanto:

CONVERT(BIT, MIN(CONVERT(INT, BitField))) as BitField
 1
Author: Chaos Legion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-22 06:34:50