Я вижу, что в SQL GROUP BY должен предшествовать выражению ORDER BY.Означает ли это, что упорядочение выполняется после группировки, отбрасывающей идентичные строки / столбцы?
Поскольку мне кажется, что сначала нужно упорядочить строки по столбцу временной метки A, ТО, отбрасывая строки с одинаковым значением в столбце A. Не уверен, каквыполнить это ...
Я использую MySQL 5.1.41
create table
(
A int,
B timestamp
)
Данные могут быть:
+-----+-----------------------+
| A | B |
+-----+-----------------------+
| 1 | today |
| 1 | yesterday |
| 2 | yesterday |
| 2 | tomorrow |
+-----+-----------------------+
Результаты Iстремлюсь будет:
+-----+-----------------------+
| A | B |
+-----+-----------------------+
| 1 | today |
| 2 | tomorrow |
+-----+-----------------------+
По сути, я хочу строки с последней отметкой времени в столбце B (думаю, ORDER BY) и только одну строку для каждого значения в столбце A (думаю, DISTINCT или GROUP BY).
Мои фактические детали проекта, если вам нужны эти:
В реальной жизни у меня есть две таблицы - users
и payment_receipts
.
create table users
(
phone_nr int(10) unsigned not null,
primary key (phone_nr)
)
create table payment_receipts
(
phone_nr int(10) unsigned not null,
payed_ts timestamp default current_timestamp not null,
payed_until_ts timestamp not null,
primary key (phone_nr, payed_ts, payed_until_ts)
)
Таблицы могут включать в себя другие столбцы, я опустил все, что IMO здесь не имеет значения.Как часть схемы мобильных платежей, я должен отправлять SMS-сообщения пользователям через мобильную сотовую сеть через определенные промежутки времени, в зависимости, конечно же, от того, должен ли платеж быть или нет.Платеж актуализируется при отправке SMS, которое облагается налогом.Я веду учет всех платежей, совершенных с помощью таблицы payment_receipts
для бухгалтерского учета, которая имитирует реальный магазин, где и покупатель, и продавец получают копию квитанции о покупке для справки.В этой таблице хранятся мои (продавцы) копии каждой квитанции.Квитанция клиента - это само полученное SMS.Каждый раз, когда отправляется SMS (и, таким образом, выполняется платеж), в таблицу вставляется запись квитанции с указанием, кто заплатил, когда и «до когда».Чтобы объяснить последнее, представьте себе услугу подписки, которая действует неограниченно долго, пока пользователь явно не откажется, после чего запись пользователя будет удалена.Оплата производится за месяц заранее, поэтому, как правило, разница между payed_ts
и payed_until_ts
составляет 30 дней.
Естественно, у меня есть пакетное задание, которое выполняется каждый день и требуетвыбрать список пользователей, которым требуется ежемесячная оплата в рамках автоматического продления подписки.Чтобы связать это с фиктивным примером ранее, столбец номера телефона phone_nr
равен a
, а payed_until_ts
равен b
, но в реальном коде есть две таблицы, которые приводят меня к следующему поведению и его последствиям: когдазапись пользователя удаляется, квитанция остается, для бухгалтерии.Таким образом, мне нужно не только сгруппировать платежи по дате и отменить все, кроме самой последней даты поступления платежа, мне также нужно следить за тем, чтобы не выбирать квитанции, для которых больше нет соответствующей пользовательской записи.
Я решаю проблему выбора записей, подлежащих оплате, путем нахождения квитанций с самым последним значением payed_until_ts
(так как в большинстве случаев для каждого номера телефона будет несколько квитанций) для каждого phone_nr
ииз этих строк мне также нужно оставить только те номера телефона, где payed_until_ts
раньше, чем время выполнения пакетного задания.Я перебираю список этих номеров и отправляю платежи, сохраняя новую квитанцию для каждого отправленного SMS, где payed_ts
равно now()
и payed_until_ts
равно now() + interval 30 days
.