Postgres настаивает на первичном ключе в выражении Group By, тогда как SQLite - нет - PullRequest
0 голосов
/ 27 октября 2019

У меня проблема с Postgres, который настаивает на том, что первичный ключ является частью предложения group by, разочарование в том, что синтаксис, который у меня есть, прекрасно работает с SQLITE.

Сообщение об ошибке - «column»Внимание, необходимо, чтобы "Внимание" было указано в предложении GROUP BY или использовалось в статистической функции.

Мой вопрос: может ли кто-нибудь предоставить исправление, такое, что Postgres выдаст вывод, который делает SQLite (оператор SQL, схема, данные? и желаемый результат представлен ниже)

Моя схема таблицы:

CREATE TABLE Attendees
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
activitynumber int,
activitydate DATE,
club int,
usernum int,
username ,
activityname ,
cost int,
received int,
update_time DATETIME,
CONSTRAINT FK_activitynumber
  FOREIGN KEY (activitynumber)
  REFERENCES Activity(activitynumber)
CONSTRAINT FK_club
  FOREIGN KEY (club)
  REFERENCES "club"(clubnum)
CONSTRAINT FK_usernum
  FOREIGN KEY (usernum)
  REFERENCES "users"(usernum)
);

CREATE INDEX ix_attendees_group ON Attendees 
(club,activitydate,activitynumber);

(Обратите внимание, я добавил индекс, чтобы попытаться решить проблему, но это не так).

activities =  Attendees.query.filter_by(club=current_user.club).order_by(Attendees.activitdate.desc()).group_by(Attendees.activitydate,Attendees.activitynumber)

У меня есть следующие данные: -

id  activitynumber  activitydate    club    usernum username    activityname    cost    received    update_time
1   3   15-10-19    1002    1002000001  susan   Monday Swim 200 0   58:43.8
2   3   15-10-19    1002    1002000002  triblokerich    Monday Swim 200 0   58:49.9
3   4   17-10-19    1002    1002000001  susan   Thursday Swim   200 0   59:04.5
4   4   17-10-19    1002    1002000015  craig   Thursday Swim   200 0   59:09.9
5   6   16-10-19    1002    1002000001  susan   Dunton  200 0   00:06.5
6   6   16-10-19    1002    1002000002  triblokerich    Dunton  200 0   00:17.6
7   3   16-10-19    1002    1002000001  susan   Monday Swim 300 0   58:28.1
8   3   16-10-19    1002    1002000002  triblokerich    Monday Swim 300 0   58:33.7
9   3   16-10-19    1002    1002000015  craig   Monday Swim 300 0   58:37.7
10  3   16-10-19    1002    1002000016  craig2  Monday Swim 300 0   01:41.8
11  3   19-10-19    1002    1002000001  susan   Monday Swim 300 0   07:56.4
12  3   19-10-19    1002    1002000002  triblokerich    Monday Swim 300 0   08:04.8

, и вывод, который я пытаюсь получить (который работает с SQLite):

Date       Activity
2019-10-19 Monday Swim
2019-10-17 Thursday Swim
2019-10-16 Monday Swim
2019-10-16 Dunton
2019-10-15 Monday Swim

1 Ответ

1 голос
/ 27 октября 2019

Если я правильно понимаю синтаксис SQL Alchemy, вы ищете что-то вроде этого, надеюсь, я не за горами (разбит на строки, чтобы показать лучше):

activities =  Attendees.query\
  .with_entities(Attendees.activitydate, Attendees.activityname)\
  .filter_by(club=current_user.club)\
  .order_by(Attendees.activitdate.desc())\
  .group_by(Attendees.activitydate,Attendees.activityname)

Вам всегда нужно иметьне сгруппированные столбцы в результирующем наборе в виде агрегатов (min, max, sum и т. д.), потому что нет способа показать их иначе. Какой идентификатор, например, будет взят из группы из пяти строк? SQLite может быть одной из неточных баз данных, которая просто отбрасывает любую строку назад, но PostgreSQL очень строги в отношении запроса и никогда не сделает этого.

В этом запросе определено, что результат должен содержать только столбцыкоторые в group_by, так как это то, что вам нужно. Он также имеет activityname как сгруппированный столбец, а не activitynumber, поскольку они должны совпадать. Таким образом, в результате нет неагрегированных не сгруппированных столбцов, а только сгруппированных, и запрос должен работать нормально.

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