SELECT, если существует, где DATE = СЕГОДНЯ, если нет, где DATE = YESTERDAY - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть таблица с некоторыми столбцами и столбцом даты (с которым я сделал раздел). Например,

[Amount, Date    ]  
[4     , 2020-4-1]  
[3     , 2020-4-2]  
[5     , 2020-4-4]  

Я хочу получить последнюю сумму на основе даты.

Я думал о выполнении LIMIT 1 с ORDER BY, но оптимизировано ли это BigQuery или оно будет сканировать всю мою таблицу?

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

Ответы [ 3 ]

3 голосов
/ 01 апреля 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT ARRAY_AGG(amount ORDER BY `date` DESC LIMIT 1)[SAFE_OFFSET(0)]
FROM `project.dataset.table`
WHERE `date` >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)  

Примечание: выше предполагается, что ваше поле date имеет тип данных DATE.

1 голос
/ 03 апреля 2020

Если ваше поле date является разделом, вы можете использовать его в предложении WHERE, чтобы отфильтровать, какие разделы должны быть прочитаны в вашем запросе.

В вашем случае вы можете сделать что-то вроде:

SELECT value
FROM <your-table>
WHERE Date >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
ORDER BY Data DESC
LIMIT 1

Этот запрос в основном будет:

  1. Фильтровать только сегодняшние и вчерашние разделы
  2. Упорядочить строки по вашему полю Date, от самых последних к старым
  3. Выберите первый элемент упорядоченного списка

Если в таблице есть строка с сегодняшней датой, запрос вернет данные за сегодня. Если это не так, запрос вернет данные за вчерашний день.

Наконец, я хотел бы добавить сюда эту ссылку относительно запросов к секционированным таблицам.

Надеюсь, это поможет

0 голосов
/ 01 апреля 2020

Порядок LIMIT останавливает запрос, когда он получает указанное количество результатов. Я думаю, что запрос должен быть примерно таким, я не уверен, что "today () - 1" возвращает

SELECT Amount
FROM <table> as t
WHERE date(t.Date) = current_date()
OR date(t.Date) = makedate(year(current_date()), dayofyear(current_date())-1);

Отредактировано: Извините, мой ответ для MariaDB. Теперь я вижу, что вы спрашиваете о Google- BigQuery, о котором я даже не знал, но похоже, что SQL, я надеюсь, что в нем есть некоторые функции, подобные тем, которые я опубликовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...