SQL查询建议 - 获取以前的客户订单

时间:2008-12-12 07:35:32

标签: sql sql-server

我有下表

custid    ordid   qty      datesold
1         A2       12      2008-01-05
2         A5       5       2008-01-02
1         A1       5       2008-01-01
2         A7       3       2007-02-05

为每位客户提供以前订单的最佳方式是什么?

由于

4 个答案:

答案 0 :(得分:3)

如果“之前”是指“最新之前的那个”:

SELECT TOP 1
  ordid
FROM
  orders
WHERE
  custid = @custid
  and datesold < (SELECT MAX(datesold) FROM orders i where i.custid = orders.custid)
ORDER BY
  datesold DESC

当然datesold必须是DATETIME,具有足够明显的值才能发挥作用。仅仅一个日期是不够的。例如,如果您有创建记录的日期,那么这将是datesold的良好替代。

答案 1 :(得分:1)

此类问题的常见解决方案是选择Max(datesold)并获取最新的方式。如果custid / dateold组合是唯一的,但如果同一天有两个订单,则可能会导致重复。

如果你有SQL 2005或更高版本,你可以使用Row_Number函数对每个客户订单进行排名,并为每个订单选择第一个:

SELECT custid, ordid, qty, datesold
FROM (
    SELECT *, 
        Row_Number() OVER (PARTITION BY custid ORDER BY datesold desc) as 'Rank'
    FROM tbl
)
WHERE Rank = 1

要确保它总是选择相同的项目,即使它们具有相同的dateold,也要在Row_number的ORDER BY子句中添加更多项目(例如RowID,recieptNumber)。

如果你没有SQL 2005,通过添加标识列可以做类似的事情:

SELECT custid, ordid, qty, datesold
FROM tbl
WHERE id = 
    (SELECT TOP 1 id FROM tbl a WHERE custid = a.custID ORDER BY dateSold)

这样做的缺点是,如果不是每一行,至少会为每个客户进行一次表查找。

如果您很幸运,您想要处理最新订单,您可以:

SELECT custid, ordid, qty, datesold
FROM tbl
INNER JOIN (
    SELECT a.id FROM tbl a GROUP BY tbl.custId
) s ON tbl.id = s.id

答案 2 :(得分:0)

假设:Datesold将按升序排列(之前订单的日期将小于当前订单的日期)

假设您希望在客户2的A5之前获得订单。以下是查询的方式。


SELECT TOP 1 *
FROM Orders
WHERE DateSold < (SELECT DateSold FROM Orders WHERE CustId = 2 and OrdID = A5)
AND CustId = 2 

答案 3 :(得分:0)

这与您提出的其他问题非常相似。

SELECT
     T1.ordid
FROM
     dbo.Sales T1
INNER JOIN dbo.Sales T2 ON
     T2.custid = T1.custid AND
     T2.datesold > T1.datesold
LEFT OUTER JOIN dbo.Sales T3 ON
     T3.custid = T1.custid AND
     T3.datesold > T1.datesold AND
     T3.datesold < T2.datesold
WHERE
     T1.custid = @custid AND
     T3.custid IS NULL

关于具有相同dateold值的行的相同警告。