我有一个返回多个值的子查询。请参阅下面的查询。对于给定的客户和日期,可能存在多个订单。在那种情况下,我只想返回一个订单(这可能听起来很奇怪,但这就是我想要完成的)。如何设置该限制?我试图在子查询中设置限制1,但我没有设法让它工作?
有什么想法吗?
我正在使用Teradata
SELECT Person.name,
(SELECT order FROM ORDER where
ORDER.name=Person.name AND
ORDER.date=(SELECT MAX(date) FROM ORDER WHERE ORDER.name=Person.name))order
FROM Person
答案 0 :(得分:3)
使用ROW_NUMBER查找每个名称的最新订单,然后加入:
SELECT
Person.name,
ORDER.order
FROM Person AS p
LEFT JOIN
(
SELECT *
FROM ORDER
QUALIFY ROW_NUMBER() OVER (PARTITION BY name ORDER BY date DESC) = 1
) as o
ON ORDER.name=Person.name
顺便说一下,这比嵌套的MAX
要好得多。而且写起来更容易: - )
答案 1 :(得分:1)
您可以使用子查询中的Top 1 MAX(日期),类似这样
SELECT Person.name,
(SELECT order FROM ORDER where
ORDER.name=Person.name AND
ORDER.date=(SELECT TOP 1 MAX(date) FROM ORDER WHERE ORDER.name=Person.name))order
FROM Person
答案 2 :(得分:1)
正如我的评论一样,答案如下:
SELECT Person.name,
(SELECT MAX(order) FROM ORDER
where ORDER.name = Person.name
AND ORDER.date = (SELECT MAX(date) FROM ORDER
WHERE ORDER.name = Person.name)) order
FROM Person
请注意,ORDER
和DATE
都是ANSI SQL中的保留字。我建议你加倍引用它们以避免将来出现问题并提高可移植性。 (例如"ORDER"
。)
答案 3 :(得分:0)
SELECT p.name, (SELECT MAX(o.order)
FROM ORDER o
WHERE o.name = p.name
AND o.date= (SELECT MAX(o.date)
FROM ORDER o
WHERE o.name = p.name))
FROM Person p