Как найти минимальное значение строковых данных в SQL - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь узнать минимальное значение строки в SQL, соответствующей столбцу типа в таблице аренды.Таблицы клиента и аренды имеют отношение первичного / внешнего ключа через столбец Customer_Id.

Таблица Lease может иметь три возможных строки для данного CustomerId.Таким образом, для каждой строки в таблице Customer таблица Lease может иметь строку Type = "T" и Type = "P" и Type = "U".

В этом случае запрос должен вернуть «P», так как это минимум трех возможных значений между T, U и P. Если в таблице Lease есть строки, соответствующие только «T» и «U»тогда запрос должен вернуть «T».

Я получаю сообщение об ошибке "Неверный синтаксис рядом с ключевым словом" из ".

Это мой оператор SQL:

select  
    Customer_Id, min(lease) as leasetype 
from 
    (values(L1.type), (L2.type), (L3.type)) as T(lease) 
from 
    CUSTOMER c 
join 
    lease L1 on L1.customer_id = c.customer_id and L1.type = 'T' 
join
    lease L2 on L2.customer_id = c.customer_id and L2.type = 'U' 
join
    lease L3 on L3.customer_id = c.customer_id and L3.type = 'P'
where 
    c.order_timestamp >=  '03/01/2018'

Ниже приведены данные моей таблицы:

enter image description here

Ответы [ 4 ]

1 голос
/ 27 марта 2019

У вас не может быть двух FROM предложений.

Кроме того, я думаю, вы можете значительно упростить запрос ...

select  
    c.customer_id, min(l.type) as leasetype 
from 
    CUSTOMER c 
join 
    lease l
        on l.customer_id = c.customer_id
where
        l.type IN ('P', 'T', 'U')
    AND c.order_timestamp >=  '03/01/2018'
GROUP BY
    c.customer_id

Если вам не нужны другие поля изтаблица lease?Затем используйте подход ROW_NUMBER() из другого ответа здесь.

0 голосов
/ 27 марта 2019

Первое, что я вижу в вашем запросе, - это синтаксис вашего ключевого слова "as T (lease)". "As" используется для создания псевдонима, и требуется только одно слово (я никогда не видел никаких других записей, но поправьте меня, еслиЯ не прав).Я бы попробовал без скобок.

Второе, что я вижу, это то, что у вас есть 2, из которых полностью запрещено. Если вы хотите использовать много таблиц, я бы посоветовал вам изучить синтаксис объединения

0 голосов
/ 27 марта 2019

Я думаю, что самый простой способ сделать это - присоединить таблицу клиентов к встроенной таблице, которая выбирает минимальную аренду.

select c.Customer_id, ml.lease
from customer c
inner join (select customer_id, min(lease) from lease) ml 
on c.customer_id = ml.customer_id
where 
    c.order_timestamp >=  '03/01/2018';
0 голосов
/ 27 марта 2019

использовать row_number ()

select customer_id, email_address,Amount from
(select c.customer_id,c.email_address,
  L1.Amount,
row_number()over(partition by c.customer_id order by 
  case when Type='P' then 1 when Type='T' then 2 else 3 end ) rn
from 
    CUSTOMER c 
join 
    lease L1 on L1.customer_id = c.customer_id
) a where a.rn=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...