Подтвердить что ты не робот

Sql Server: как использовать агрегатную функцию, такую ​​как MAX в предложении WHERE

Я хочу получить максимальное значение для этой записи. Пожалуйста, помогите мне:

SELECT rest.field1 
    FROM mastertable AS m
    INNER JOIN  (
        SELECT t1.field1 field1, 
               t2.field2
            FROM table1 AS T1 
            INNER JOIN table2 AS t2 ON t2.field = t1.field 
            WHERE t1.field3=MAX(t1.field3)
        --                  ^^^^^^^^^^^^^^  Help me here.
    ) AS rest ON rest.field1 = m.field
4b9b3361

Ответ 1

Вы можете использовать дополнительный запрос...

WHERE t1.field3 = (SELECT MAX(st1.field3) FROM table1 AS st1)

Но я бы действительно переместил это из предложения where и в оператор объединения, как предложение AND для предложения ON.

Ответ 2

Как вы заметили, предложение WHERE не позволяет вам использовать в нем агрегаты. Это предложение HAVING для.

HAVING t1.field3=MAX(t1.field3)

Ответ 3

Правильный способ использования max в условии наличия состоит в том, чтобы сначала выполнить самоподключение:

select t1.a, t1.b, t1.c
from table1 t1
join table1 t1_max
  on t1.id = t1_max.id
group by t1.a, t1.b, t1.c
having t1.date = max(t1_max.date)

Ниже приводится описание того, как вы присоединяетесь к подзапросу:

select t1.a, t1.b, t1.c
from table1 t1
where t1.date = (select max(t1_max.date)
                 from table1 t1_max
                 where t1.id = t1_max.id)

Обязательно создайте один набор данных перед использованием агрегата при соединении с несколькими таблицами:

select t1.id, t1.date, t1.a, t1.b, t1.c
into #dataset
from table1 t1
join table2 t2
  on t1.id = t2.id
join table2 t3
  on t1.id = t3.id


select a, b, c
from #dataset d
join #dataset d_max
  on d.id = d_max.id
having d.date = max(d_max.date)
group by a, b, c

Версия вспомогательного запроса:

select t1.id, t1.date, t1.a, t1.b, t1.c
into #dataset
from table1 t1
join table2 t2
  on t1.id = t2.id
join table2 t3
  on t1.id = t3.id


select a, b, c
from #dataset d
where d.date = (select max(d_max.date)
                from #dataset d_max
                where d.id = d_max.id)

Ответ 4

SELECT rest.field1
FROM mastertable as m
INNER JOIN table1 at t1 on t1.field1 = m.field
INNER JOIN table2 at t2 on t2.field = t1.field
WHERE t1.field3 = (SELECT MAX(field3) FROM table1)

Ответ 5

да, вам нужно использовать предложение having после предложения Group by, поскольку там, где нужно просто фильтровать данные по простым параметрам, но группа, за которой следует оператор наличия, - это идея группировать данные и фильтровать их на основе некоторой совокупной функции......

Ответ 6

Но он все еще выдаёт сообщение об ошибке в Query Builder. Я использую SqlServerCe 2008.

SELECT         Products_Master.ProductName, Order_Products.Quantity, Order_Details.TotalTax, Order_Products.Cost, Order_Details.Discount, 
                     Order_Details.TotalPrice
FROM           Order_Products INNER JOIN
                     Order_Details ON Order_Details.OrderID = Order_Products.OrderID INNER JOIN
                     Products_Master ON Products_Master.ProductCode = Order_Products.ProductCode
HAVING        (Order_Details.OrderID = (SELECT MAX(OrderID) AS Expr1 FROM Order_Details AS mx1))

Я заменил ГДЕ ИХ, как сказал @powerlord. Но все же показывается ошибка.

Ошибка синтаксического анализа запроса. [Номер строки токена = 1, смещение линии токена = 371, токен с ошибкой = SELECT]