es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Función NULLS LAST para Hive.

Tiene el siguiente algoritmo para seleccionar registros, siguiendo el ejemplo escrito a continuación, se deben seleccionar los siguientes registros.

  1. Si “issuedate” es una columna vacía, entonces tomar “publid”, que tiene más “inn”.

  2. Si “issuedate” no es totalmente igual, entonces tomamos “issuedate” = última fecha.

  3. Si “issuedate” es igual, entonces tomamos “operdate” = última fecha.

  4. Si “issuedate” son iguales y operdate son iguales, entonces tomamos “publid”, que tiene más “inn”.

Escribió un código en Oracle y quería ejecutarlo en Hive, pero aparece un error. Creo que se debe a la función NULLS LAST. Por favor, dígame cómo cambiar la función NULLS LAST en el código a la correcta para Hive.

Ejemplo

| inn | publid | clusterid | issuedate | operdate |
|-----|--------|-----------|-----------|----------|
| 333 |   1    |    12     |  01-01-21 | 05-01-21 |
| 222 |   1    |    12     |  01-01-21 | 05-01-21 |
| 333 |   2    |    12     |  01-01-21 | 05-01-21 | 
| 222 |   2    |    12     |  01-01-21 | 05-01-21 |
| 111 |   2    |    12     |  01-01-21 | 05-01-21 |
|-----|--------|-----------|-----------|----------|
| 123 |   1    |     1     |  01-01-21 |          |
| 456 |   1    |     1     |  01-01-21 |          |
| 123 |   2    |     1     |  03-01-21 |          |
| 456 |   2    |     1     |  03-01-21 |          | 
| 789 |   2    |     1     |  03-01-21 |          |
| 123 |   3    |     1     |  02-01-21 |          |
| 456 |   3    |     1     |  02-01-21 |          |
|-----|--------|-----------|-----------|----------|
| 123 |   1    |     1     |           | 01-01-21 |
| 456 |   1    |     1     |           | 01-01-21 |
| 123 |   2    |     1     |           | 03-01-21 |
| 456 |   2    |     1     |           | 03-01-21 | 
| 789 |   2    |     1     |           | 03-01-21 |
| 123 |   3    |     1     |           | 02-01-21 |
| 456 |   3    |     1     |           | 02-01-21 |

Resultado

| inn | publid | clusterid | issuedate | operdate |
|-----|--------|-----------|-----------|----------|
| 333 |   2    |    12     |  01-01-21 | 05-01-21 |
| 222 |   2    |    12     |  01-01-21 | 05-01-21 |
| 111 |   2    |    12     |  01-01-21 | 05-01-21 |
|-----|--------|-----------|-----------|----------|
| 123 |   2    |     1     |  03-01-21 |          |
| 456 |   2    |     1     |  03-01-21 |          |
| 789 |   2    |     1     |  03-01-21 |          |
|-----|--------|-----------|-----------|----------|
| 123 |   2    |     1     |           | 03-01-21 |
| 456 |   2    |     1     |           | 03-01-21 |
| 789 |   2    |     1     |           | 03-01-21 |
    SELECT inn,
       publid,
       clusterid,
       issuedate,
       operdate
FROM   (
  SELECT inn,
         publid,
         clusterid,
         issuedate,
         operdate,
         DENSE<em>RANK() OVER (
           PARTITION BY clusterid
           ORDER     BY CASE WHEN issuedate IS NULL THEN operdate ELSE issuedate END DESC,
                        cnt DESC
         ) AS rnk
  FROM   (
    SELECT t.*,
           COUNT(inn) OVER (PARTITION BY publid) cnt
    FROM   table</em>name t
    WHERE  clusterid is not null
  )
)
WHERE  rnk = 1;
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para cambiar la función NULLS LAST en el código por la correcta para Hive, puede reemplazar la siguiente línea:

    ORDER BY COALESCE(issuedate, operdate) DESC NULLS LAST,

    con:

    ORDER BY COALESCE(issuedate, operdate) DESC, issuedate DESC NULLS LAST, operdate DESC NULLS LAST,

    Esto debería ordenar correctamente los registros con una columna “issuedate” no nula primero, seguido por valores nulos de “issuedate” ordenados por valores nulos de “operdate” al final.

Comments are closed.