SQL-запрос, избавляющийся от повторных выборок

#python #sql #sqlite

#python #sql #sqlite

Вопрос:

Я использую sqlite3 в python, и у меня есть таблица со следующими столбцами:

идентификатор записи (int), имя пользователя (текст), местоположения (текст), типы (текст), занятость (int), time_added (дата-время), токен (текст) и (отменить).

У меня есть следующий запрос, в котором я выбираю данные из таблицы в зависимости от того, какова занятость, и добавленное время находится между 2 указанными временами ввода пользователем, который является start_date и end_date:

 ('''SELECT locations, types, 
           (SELECT COUNT (occupancy) FROM traffic WHERE undo = 0 AND occupancy = 1 AND types = ? AND time_added BETWEEN ? AND ?),
           (SELECT COUNT (occupancy) FROM traffic WHERE undo = 0 AND occupancy = 2 AND types = ? AND time_added BETWEEN ? AND ?),
           (SELECT COUNT (occupancy) FROM traffic WHERE undo = 0 AND occupancy = 3 AND types = ? AND time_added BETWEEN ? AND ?),
           (SELECT COUNT (occupancy) FROM traffic WHERE undo = 0 AND occupancy = 4 AND types = ? AND time_added BETWEEN ? AND ?),
    FROM traffic WHERE types = ? GROUP BY type''', 
(vehicle, start_date, end_date, vehicle, start_date, end_date, vehicle, start_date, end_date, vehicle, start_date, end_date, vehicle)
 

Есть ли какой-нибудь способ сконденсировать это, чтобы мне не приходилось копировать и вставлять одно и то же несколько раз, просто чтобы изменить заполняемость? Я попытался использовать цикл for, но это ни к чему меня не привело.

Ваше здоровье!

Ответ №1:

Я уверен, что это может значительно упростить запрос:

 SELECT type
       SUM( occupancy = 1 ) as cnt_1,
       SUM( occupancy = 2 ) as cnt_2,
       SUM( occupancy = 3 ) as cnt_3,
       SUM( occupancy = 4 ) as cnt_4
FROM traffic
WHERE undo = 0 AND
      type = ? AND
      time_added BETWEEN ? AND ?
GROUP BY type;
 

Однако я не уверен, что именно это имеет в виду ваш вопрос.

Комментарии:

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