【问题标题】:Query listing company name and first order date查询上市公司名称及首单日期
【发布时间】:2013-12-27 05:54:29
【问题描述】:
正如标题所说,我正在尝试编写一个查询来显示客户 ID、公司名称和他们的第一个订单日期(列出的最早日期)。我试过Top 1,但没有用。使用 SQL Server 2012。
Select c.CustomerID, CompanyName, top 1 o.OrderDate as 'first order date'
from Customers c join Orders o on
c.CustomerID = o.CustomerID
order by c.CustomerID
任何建议或帮助将不胜感激!
【问题讨论】:
标签:
sql
sql-server-2012
filtering
【解决方案1】:
select c.CustomerID, CompanyName, MIN(o.OrderDate) as 'first order date'
from
Customers c
join Orders o on c.CustomerID = o.CustomerID
group by c.CustomerID, CompanyName
order by c.CustomerID
【解决方案2】:
此解决方案更加灵活,因为它允许您从Customers 表中添加任何列,而无需将它们添加到GROUP BY:
;WITH x AS
(
SELECT CustomerID, OrderDate = MIN(OrderDate)
FROM dbo.Orders GROUP BY CustomerID
)
SELECT c.CustomerID, c.CompanyName, x.OrderDate
FROM dbo.Customers AS c
INNER JOIN x ON c.CustomerID = x.CustomerID
ORDER BY c.CustomerID;
如果您还想要第一个订单的其他列,例如订单总额,您可以这样做,使用 GROUP BY 时无法添加,因为例如最便宜或最昂贵的订单不会必然对应一阶:
;WITH x AS
(
SELECT CustomerID, OrderDate, TotalAmount, /* ...other columns... */
rn = ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY OrderDate)
FROM dbo.Orders GROUP BY CustomerID
)
SELECT c.CustomerID, c.CompanyName, x.OrderDate, x.TotalAmount /* ...others... */
FROM dbo.Customers AS c
INNER JOIN x ON c.CustomerID = x.CustomerID
WHERE x.rn = 1
ORDER BY c.CustomerID;