2016-03-18 5 views
1

У меня есть следующие структуры таблицы:PSQL: выберите вложенный запрос и группы по

dev=> \d membership_subscription 
             Table "public.membership_subscription" 
     Column  |   Type   |        Modifiers        
--------------------+--------------------------+---------------------------------------------------------------------- 
id     | integer     | not null default nextval('membership_subscription_id_seq'::regclass) 
membership_id  | bigint     | not null 
name    | character varying  | not null 
description  | character varying  | 
price_gross  | integer     | not null 
price_net   | integer     | not null 
tax    | double precision   | not null 
priority   | integer     | not null default 0 
currency_code  | character varying  | not null 
calculated_gross | integer     | not null 
calculated_net  | integer     | not null 
state    | character varying  | 
reference_date  | timestamp with time zone | not null 
created_at   | timestamp with time zone | not null 
created_by   | json      | not null 
updated_at   | timestamp with time zone | not null 
updated_by   | json      | not null 
payment_method_id | bigint     | 
code    | character varying  | 
bookings_per_month | integer     | not null default 0 
bookings_per_venue | integer     | not null default 0 
Indexes: 
    "membership_subscription_pkey" PRIMARY KEY, btree (id) 
    "membership_id_reference_date_index" UNIQUE, btree (membership_id, reference_date) 
Foreign-key constraints: 
    "membership_subscription_membership_id_fkey" FOREIGN KEY (membership_id) REFERENCES membership(id) ON UPDATE CASCADE 
    "membership_subscription_payment_method_id_fkey" FOREIGN KEY (payment_method_id) REFERENCES payment_saved_method(id) ON UPDATE CASCADE ON DELETE SET NULL 

Я хочу:

  • ВЫБРАТЬ membership_id & имя
  • GROUP BY membership_id
  • Получите максимум reference_date
  • Не в ('новый', 'discurded')

Примечания: Каждый членство имеет 12 подписок, поэтому я хочу, чтобы выбрать те, которые только не в состоянии («новый», «отбрасывают»), то максимальное reference_date из них

Моя попытка:

dev=> SELECT membership_id, name FROM membership_subscription WHERE state NOT IN ('new', 'discurded') GROUP BY membership_id, name, reference_date ORDER BY reference_date DESC; 

Но не вернуть то, что ожидалось для меня

ответ

0
WITH membership_subscription(membership_id,name,state,reference_date) AS (VALUES 
    (1,'name-1','new','2016-03-18'::DATE), 
    (1,'name-2','discurded','2016-03-17'::DATE), 
    (1,'name-3','state 1','2016-03-16'::DATE), -- record #1 to select 
    (1,'name-4','state 2','2016-03-15'::DATE), 
    (2,'name-5','new','2015-03-15'::DATE), 
    (2,'name-6','discurded','2015-03-16'::DATE), 
    (2,'name-7','state 3','2015-03-17'::DATE), 
    (2,'name-8','state 4','2015-03-18'::DATE) -- record #2 to select 
) 
SELECT 
    DISTINCT ON (membership_id) 
    membership_id, 
    name, 
    max(reference_date) 
FROM membership_subscription 
WHERE state NOT IN ('new','discurded') 
GROUP BY membership_id,name; 
0

Ваша ошибка состоит в том, чтобы включить reference_date в группировке, удалите его и ваш запрос должен работать , Чтобы получить последнюю ссылку reference_date в каждой группе, вы должны использовать агрегатную функцию max.

код (я не проверял):

SELECT membership_id, name, max(reference_date) FROM membership_subscription WHERE state NOT IN ('new', 'discurded') GROUP BY membership_id, name ORDER BY 3 DESC; 
Смежные вопросы