Существует ли [простой] способ заказать результаты *сначала*, *затем* группа другим столбцом, с SQL?

Я вижу, что в SQL, GROUP BY должен предшествовать выражению ORDER BY. Это подразумевает, что упорядочивание сделано после группировки отбрасываний идентичные строки/столбцы?

Поскольку я, кажется, должен заказать строки столбцом метки времени первое, ЗАТЕМ отбрасывающие строки с идентичным значением в столбце A. Не уверенный, как выполнить это...

Я использую MySQL 5.1.41

create table
(
    A int,
    B timestamp
)

Данные могли быть:

+-----+-----------------------+
|  A  |  B                    |
+-----+-----------------------+
|  1  |  today                |
|  1  |  yesterday            |
|  2  |  yesterday            |
|  2  |  tomorrow             |
+-----+-----------------------+

Результаты, к которым я стремлюсь, были бы:

+-----+-----------------------+
|  A  |  B                    |
+-----+-----------------------+
|  1  |  today                |
|  2  |  tomorrow             |
+-----+-----------------------+

В основном я хочу строки с последней меткой времени в столбце B (думайте ORDER BY), и только одна строка для каждого значения в столбце A (думают ОТЛИЧНЫЙ или 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 и из тех строк я далее должен оставить только те phone_numbers где payed_until_ts ранее, чем время, которое выполняет пакетное задание. Я циклично выполняюсь по списку этих чисел и отсылаю платежи, храня новое получение для каждого отправленного SMS, где payed_ts now() и payed_until_ts now() + interval 30 days.

5
задан amn 2 October 2019 в 08:27
поделиться