Я использую клиент kysely для подключения к базе данных Postgres, но вы также можете предоставить решение на простом SQL.
Вы можете понять структуру базы данных, посмотрев на эту функцию миграции:
await db.schema
.createTable("BigPaint")
.addColumn("id", "uuid", (col) =>
col
.primaryKey()
.defaultTo(sql`gen_random_uuid()`)
.notNull(),
)
.addColumn("createdAt", "timestamptz", (col) =>
col.defaultTo(sql`now()`).notNull(),
)
.addColumn("name", "text", (col) => col.notNull())
.execute();
await db.schema
.createTable("Inspiration")
.addColumn("id", "uuid", (col) =>
col
.primaryKey()
.defaultTo(sql`gen_random_uuid()`)
.notNull(),
)
.addColumn("createdAt", "timestamptz", (col) =>
col.defaultTo(sql`now()`).notNull(),
)
.addColumn("bigPaintId", "uuid", (col) =>
col.references("BigPaint.id").onDelete("cascade").notNull(),
)
.addColumn("traitId", "uuid", (col) =>
col.defaultTo(sql`gen_random_uuid()`).notNull(),
)
.addColumn("content", "text", (col) => col.notNull())
.execute();
await db.schema
.createIndex("Inspiration_bigPaintIdIndex")
.on("Inspiration")
.columns(["bigPaintId"])
.execute();
await db.schema
.createView("InspirationView")
Как видите, в последних строках кода я создаю представление. Я хочу, чтобы таблица Inspiration была переупорядочена следующим образом: строки должны быть упорядочены с помощью созданногоAt, но строки с одинаковым идентификатором типажа должны рассматриваться как одна строка, следовательно, одно значение созданногоAt. Я думаю, лучше объяснить это на примере упорядоченной таблицы.
Я пробовал разные запросы, используя with, partBy, orderBy, но мне удалось правильно упорядочить только в конце максимум по одному столбцу.
pg_dump --schema-only -t BigPaint -t Inspiration <database name> даст create table заявления. Их гораздо легче понять.


Чтобы упорядочить минимум "createdAt" на группу одинаковых "traitId" без фактического агрегирования строк, используйте оконную функцию :
SELECT content, "createdAt", "traitId"
FROM "Inspiration"
ORDER BY min("createdAt") OVER (PARTITION BY "traitId"), "traitId", "createdAt", content;
Не обязательно включать одно и то же выражение в список SELECT.
Я добавил "traitId", "createdAt", content в качестве (необязательно) дополнительных ORDER BY выражений, чтобы разорвать связи и сделать порядок детерминированным.
Кроме того: избегайте этих идентификаторов со смешанным регистром, чтобы облегчить вашу жизнь с Postgres. Видеть:
Это работает, за исключением порядка элементов групп: вместо этого строки должны быть упорядочены независимо с помощью createAt asc.
@paolodelfino: Смотрите обновление.
Пожалуйста, покажите простое определение таблицы SQL, примеры данных, вашу попытку запроса и его результат, ожидаемый результат, указав, где это неправильно.