Как агрегировать эту простую SQL? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть такая таблица:

ID Value Key
0  ValA  0
1  ValB  0
2  ValC  1
4  ValD  0
5  ValE  1

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

SELECT Key FROM MyTable WHERE Key=1 ORDER BY ID ASC LIMIT 1

Теперь я хотел бы объединить запрос с обычным SELECT, чтобы у меня была вся агрегированная информация в одном go. * 1007. *

Моя следующая попытка не удалась, я попытался:

SELECT 
    ID,
    Value,
    Key,
    (SELECT Key FROM MyTable WHERE Key=1 ORDER BY ID ASC LIMIT 1 AS FirstKeyIs1) 
FROM MyTable

Как мне переписать мой запрос? Ожидаемое поведение будет иметь FirstKeyIs1, равное 2. Цель в конечном итоге отфильтровать идентификаторы с ключевым свойством до 2.

ID Value Key FirstKeyIs1
0  ValA  0   2
1  ValB  0   2
2  ValC  1   2
4  ValD  0   2
5  ValE  1   2 

1 Ответ

2 голосов
/ 03 мая 2020

Если ваша база данных поддерживает оконные функции, вы можете сделать:

select
    t.*,
    min(case when key = 1 then id end) over() firstKeyIs1
from mytable t

В противном случае ваш подход с использованием подзапроса в порядке. Вам просто нужно переместить псевдоним столбца из подзапроса - и, вероятно, вы хотите вернуть id вместо key:

select
    t.*,
    (select id from mytable where key = 1 order by id limit 1) firstKeyIs1 
from mytable

Или вы можете использовать агрегацию в подзапросе:

select
    t.*,
    (select min(id) from mytable where key = 1) firstKeyIs1 
from mytable
...