Массив порядков групп в PostgreSQL полностью неверен - PullRequest
0 голосов
/ 25 марта 2012

Это правильный упорядоченный массив с MySQL:

[
  [1330210800000, 1],
  [1330297200000, 6],
  [1330383600000, 10], 
  [1330470000000, 2],
  [1330556400000, 5],
  [1330815600000, 9],
  [1331593200000, 2], 
  [1331852400000, 4],
  [1331938800000, 8],
  [1332111600000, 8],
  [1332198000000, 4], 
  [1332284400000, 8],
  [1332370800000, 3], 
  [1332630000000, 2] 
]

Но с PostgreSQL массив выглядит так:

[
  [1330588800000, 5], 
  [1332399600000, 3], 
  [1330848000000, 9], 
  [1330416000000, 10], 
  [1331622000000, 2], 
  [1330329600000, 6], 
  [1330502400000, 2], 
  [1332140400000, 8], 
  [1332313200000, 8], 
  [1330243200000, 1], 
  [1332226800000, 4], 
  [1331967600000, 8], 
  [1332658800000, 2], 
  [1331881200000, 4] 
]

PostgreSQL - неправильный порядок, даты разные и количество кликов:

Это запрос в моем контроллере:

@kliks = Klik.count( :group => "DATE( created_at )" )
         .map{|k, v| [(Time.parse(k).to_i * 1000), v] }

Ответы [ 2 ]

4 голосов
/ 25 марта 2012

Вы не указали какой-либо конкретный порядок в своем запросе, поэтому база данных может возвращать ваши результаты в любом порядке. Очевидно, MySQL упорядочивает результаты как побочный эффект своего GROUP BY, но PostgreSQL не обязательно сделает это. Так что ваша первая «ошибка» - просто неверное предположение с вашей стороны. Если вы хотите, чтобы база данных выполняла сортировку, вам нужно что-то вроде:

Klik.count(:group => 'date(created_at)', :order => :date_created_at)

Если вы выбрасываете * 1000 и сортируете целые временные метки:

1330210800, 1,  MySQL
1330243200, 1,  PostgreSQL

1330297200, 6,  MySQL
1330329600, 6,  PostgreSQL

1330383600, 10, MySQL
1330416000, 10, PostreSQL

...

Вы увидите, что они на самом деле выстраиваются довольно хорошо, и целочисленные временные метки отличаются на 32400 с (AKA 9 часов) или 28800 с (AKA 8 часов или 9 часов с настройкой DST) в каждой паре MySQL / PostgreSQL. Предположительно, вы включаете часовой пояс (с DST) в одно из ваших преобразований, в то время как другой остается в UTC.

0 голосов
/ 25 марта 2012

Вы действительно упускаете пункт заказа.По умолчанию серверы баз данных возвращают группы в «случайном» порядке. Правило: , когда вам нужно исправить заказ, всегда используйте ORDER BY (в рельсах: заказ).

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