Получение одной и той же строки, возвращаемой каждый раз при заказе по метке времени

#sql #postgresql #ruby-on-rails-3

#sql #postgresql #ruby-on-rails-3

Вопрос:

Моя база данных postgresql продолжает возвращать одну и ту же последнюю строку при заказе по created_at (метка времени) и ограничивает количество результатов.

Последним результатом всегда является одна и та же строка. Взгляните на последний идентификатор в этих результатах:

 looked=# select id,created_at from businesses order by created_at asc limit 2;
id |          created_at
---- -------------------------------
38 | 2011-04-30 18:31:23.923475 10
20 | 2011-04-30 18:31:23.923475 10
(2 rows)

looked=# select id,created_at from businesses order by created_at asc limit 5;
id  |          created_at
------ -------------------------------
38 | 2011-04-30 18:31:23.923475 10
436 | 2011-04-30 18:31:23.923475 10
1334 | 2011-04-30 18:31:23.923475 10
2845 | 2011-04-30 18:31:23.923475 10
20 | 2011-04-30 18:31:23.923475 10
(5 rows)

looked=# select id,created_at from businesses order by created_at asc limit 10;
id  |          created_at
------ -------------------------------
38 | 2011-04-30 18:31:23.923475 10
436 | 2011-04-30 18:31:23.923475 10
1334 | 2011-04-30 18:31:23.923475 10
2845 | 2011-04-30 18:31:23.923475 10
3381 | 2011-04-30 18:31:23.923475 10
1089 | 2011-04-30 18:31:23.923475 10
822 | 2011-04-30 18:31:23.923475 10
2310 | 2011-04-30 18:31:23.923475 10
1773 | 2011-04-30 18:31:23.923475 10
20 | 2011-04-30 18:31:23.923475 10
(10 rows)
  

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

1. Значения одинаковы, потому что это мои исходные данные, и я выбрал установить все значения created_at в NOW (). Есть ли способ лучше?

Ответ №1:

Все created_at значения одинаковы. ПОРЯДОК ПО и ОГРАНИЧЕНИЕ будут произвольно выбирать строки из набора строк, где created_at наименьшее значение

Вам пришлось бы добавить дополнительное условие сортировки для «разрыва связей» этих строк. Здесь я добавил id

 select id,created_at from businesses
order by created_at asc, id limit 5;
  

Ответ №2:

Значение created_at для каждой строки идентично. Postgres произвольно разрывает связи. Добавьте другое условие заказа (например, по идентификатору), если вы хотите больше контроля / предсказуемости.