2008-12-11 96 views
1

我有一个表格,用于存储客户销售(按期刊,如报纸)的数据。产品按问题存储。例如SQL查询建议 - 最近的项目

 
custid prodid issue qty  datesold 
1  123  2  12  01052008 
2  234  1  5  01022008 
1  123  1  5  01012008 
2  444  2  3  02052008 

我如何可以检索(什么更快的方法)的所有产品拿到最后一个问题,对于一个特定的客户?我可以为SQL Server 2000和2005提供示例吗?请注意,该表超过500k行。

谢谢

+0

一个解释,是在数据库中销售一列日期类型吗? – JohnFx 2008-12-11 21:58:56

+0

你是什么意思的“获得最后一期”? – 2008-12-11 21:59:37

+0

是的,出售日期 – 2008-12-11 22:00:47

回答

3

假设“最新”按日期(而非发行数量)来确定,这种方法通常是相当快,假设像样的指标:

SELECT 
    T1.prodid, 
    T1.issue 
FROM 
    Sales T1 
LEFT OUTER JOIN dbo.Sales T2 ON 
    T2.custid = T1.custid AND 
    T2.prodid = T1.prodid AND 
    T2.datesold > T1.datesold 
WHERE 
    T1.custid = @custid AND 
    T2.custid IS NULL 

处理50万行的东西,一台笔记本电脑大概可以处理不麻烦,更何况是一个真正的服务器,所以我会留下清晰非规范化数据库的“表演”。不要在其他地方追踪“最后售出”,从而增加额外的维护,不准确性和最令人头疼的问题。

编辑:我忘了提及......这不具体处理两个问题具有相同的确切datesold案件。您可能需要根据您的业务规则对该情况进行调整。

3

通用SQL; SQL Server的语法不应该有太大的不同:

SELECT prodid, max(issue) FROM sales WHERE custid = ? GROUP BY prodid; 
0

查询现有的日益增长的历史表是太慢了!

强烈建议您创建一个新表tblCustomerSalesLatest,它存储每个客户的最新问题数据。并从那里选择。

2

这是一个新项目吗?如果是这样,我会很小心设置你的数据库是这样的,并宣读了正常化一点,这样你可能最终得到这样的:

CustID LastName FirstName 
------ -------- --------- 
1  Woman Test 
2  Man  Test 

ProdID ProdName 
------ -------- 
123 NY Times 
234 Boston Globe 

ProdID IssueID PublishDate 
------ ------- ----------- 
123 1  12/05/2008 
123 2  12/06/2008 

CustID OrderID OrderDate 
------ ------- --------- 
1  1  12/04/2008 

OrderID ProdID IssueID Quantity 
------- ------ ------- -------- 
1  123 1  5 
2  123 2  12 

我必须知道你的数据库更好地想出一个更好的模式,但听起来你正在将太多的东西建在一张平板的桌子上,这会导致很多问题。

1

如果您正在寻找最近的出售日期也许这就是你需要:

SELECT prodid, issue 
    FROM Sales 
WHERE custid = @custid 
     AND datesold = SELECT MAX(datesold) 
         FROM Sales s 
         WHERE s.prodid = Sales.prodid 
         AND s.issue = Sales.issue 
         AND s.custid = @custid