我有下表
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
为每位客户提供以前订单的最佳方式是什么?
由于
答案 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值的行的相同警告。