SQL查询建议 - 最新项目

时间:2008-12-11 21:56:59

标签: sql sql-server

我有一张表,用于存储客户销售(在期刊上,如报纸上)数据。产品按问题存储。实施例

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行。

由于

5 个答案:

答案 0 :(得分:3)

通用SQL; SQL Server的语法应该没有太大区别:

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

答案 1 :(得分: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

处理500k行是笔记本电脑可以毫无问题地处理的事情,更不用说真正的服务器了,所以我不会为了“性能”而对数据库进行非规范化处理。不要通过跟踪其他地方的“最后一次售出”来增加额外的维护,不准确和最重要的麻烦。

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

答案 2 :(得分:1)

这是一个新项目吗?如果是这样,我会谨慎地设置这样的数据库并阅读一些关于规范化的内容,以便最终得到类似的内容:

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

我必须更好地了解你的数据库才能想出更好的架构,但这听起来好像你在平板桌上构建了太多东西,这将导致很多问题。

答案 3 :(得分: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 

答案 4 :(得分:0)

查询现有的成长历史表太慢了!

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