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.)
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 elCASE
)
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
.
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.
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
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
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)))
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.
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
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