Выбор строк с максимальным значением, объединяющий ГДЕ. Макс и CAST, в искре. sql - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть таблица в Spark со столбцом date_string типа string.

Я ищу , чтобы выбрать строки, соответствующие самой последней дате . Я думал, что можно было бы добиться этого одной командой, приведя строковый столбец к цифре c и выбрав строки, соответствующие максимальной дате.

Я пытался

SELECT 
    *, 
    CAST(date_string AS INT) AS date
FROM 
    data.some_table
WHERE 
    date = MAX(date)

Но это выдает ошибку

Error in SQL statement: AnalysisException: cannot resolve '`date`' given input columns

Поэтому я попытался

SELECT 
    *, 
    CAST(date_string AS INT) AS date
FROM 
    data.some_table
WHERE 
    date = (SELECT MAX(date_string) FROM data.some_table)

, что выдает мне то же сообщение об ошибке.

И

SELECT 
    * 
FROM 
    (SELECT *, CAST(date_string AS INT) AS date 
    FROM data.some_table)
WHERE 
   date = MAX(date)

дает me

Error in SQL statement: UnsupportedOperationException: Cannot evaluate expression: max(cast(input[71, string, false] as int))

И

SELECT 
    *, 
    CAST(date_string AS INT) AS date 
FROM
    data.some_table
WHERE 
    CAST(date_string AS INT) = MAX(CAST(date_string AS INT))

выдает мне то же сообщение об ошибке, что и предыдущая команда.

Я новичок и в Spark, и в SQL, поэтому я полностью потерян здесь Какая правильная команда для достижения того, чего я хотел?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Вам не нужно приводить строку даты к числу. Так что это должно делать то, что вы хотите:

SELECT t.*
FROM data.some_table
ORDER BY date_string DESC
LIMIT 1;

Это предполагает, что date_string имеет приемлемый формат, например, YYYY-MM-DD.

Во-вторых, возвращается только одна строка. Если вы можете иметь дубликаты, то один метод:

SELECT t.*
FROM data.some_table t
WHERE t.date_string = (SELECT MAX(t2.date_string)
                       FROM data.some_table t2
                      );
0 голосов
/ 05 февраля 2020

Вы, кажется, уже довольно близко. Однако вы не можете использовать столбец, вычисленный в предложении FROM в предложении WHERE (он оценивается перед предложением SELECT).

Это должно работать:

SELECT 
    *, 
    CAST(date_string AS INT) AS date
FROM 
    data.some_table
WHERE 
    date_string = (SELECT MAX(date_string) FROM data.some_table)

Или, если вам нужно cast перед сравнением, то:

SELECT 
    *, 
    CAST(date_string AS INT) AS date
FROM 
    data.some_table
WHERE 
    CAST(date_string AS INT) = (SELECT MAX(CAST(date_string AS INT)) FROM data.some_table)

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

SELECT 
    *, 
    CAST(date_string AS INT) AS date
FROM 
    data.some_table
ORDER BY
    date_string
LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...