SQL查询建议-最近的项

SQL查询建议-最近的项,sql,sql-server,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 我如何才能

我有一个表格,可以存储期刊上的客户销售额,比如报纸数据。该产品按问题存储。范例

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行


感谢

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

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

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

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

查询现有不断增长的历史表太慢了


强烈建议您创建一个新表tblCustomerSalesLatest,该表存储每个客户的最后一期数据。然后从中选择

查询现有不断增长的历史表太慢了


强烈建议您创建一个新表tblCustomerSalesLatest,该表存储每个客户的最后一期数据。然后从中选择

这是一个新项目吗?如果是这样的话,我会小心这样设置您的数据库,并阅读一些关于规范化的内容,这样您可能会得到如下结果:

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

我必须更好地了解您的数据库,才能提出更好的模式,但听起来好像您在一个平面表中构建了太多的内容,这会导致很多问题。

这是一个新项目吗?如果是这样的话,我会小心这样设置您的数据库,并阅读一些关于规范化的内容,这样您可能会得到如下结果:

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

我必须更好地了解您的数据库,才能提出更好的模式,但听起来您在一个平面表中构建了太多的内容,这将导致很多问题。

如果您正在寻找最新的销售日期,可能您需要:

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 

如果您正在寻找最新的销售日期,也许这就是您需要的:

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 

假设最新版本是由日期而不是发行号确定的,则该方法通常非常快速,假设索引适当:

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行可能是笔记本电脑可以轻松处理的事情,更不用说真正的服务器了,所以我不会为了性能而对数据库进行非规范化。不要通过跟踪上次在其他地方销售的产品来增加额外的维护、不准确,以及最令人头疼的问题


编辑:我忘了提。。。这并不特别适用于两种发行日期相同的情况。在这种情况下,您可能需要根据您的业务规则对其进行调整。

假设最新版本是由日期而不是发行号确定的,那么这种方法通常非常快,假设索引合理:

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行可能是笔记本电脑可以轻松处理的事情,更不用说真正的服务器了,所以我不会为了性能而对数据库进行非规范化。不要通过跟踪上次在其他地方销售的产品来增加额外的维护、不准确,以及最令人头疼的问题



编辑:我忘了提。。。这并不特别适用于两种发行日期相同的情况。您可能需要根据您的业务规则对此情况进行调整。

有一点需要澄清,销售栏是数据库中的日期类型吗?获取最后一期是什么意思?我希望能够为每个产品获取最近的最后一期。定义“最近”:较低的期数是否可以在较高的期数之后销售,如果是这样的话,你关心哪一个?我关心的是更高的发行号,现在同一个发行号每年都会重复1-52次。一个澄清,数据库中的销售栏是日期类型吗?你说的“获取最后一期”是什么意思?我想能够,对于每个产品,请获取最近的最后一个发行号。定义“最近的”:较低的发行号是否可以在较高的发行号之后出售,如果是,您关心哪一个?我关心较高的发行号,现在相同的发行号每年都会重复1-52次。此优化将导致数据库架构不再规范化。过早优化是万恶之源。有了适当的索引,max/group by答案就可以了。它看起来像一个olap分析数据库,而不是oltp事务数据库,在这种情况下,它必须被非规范化。按用例!这就是顾客所付的钱。干净的解决方案不是100%规范化的,而是快速实用的。如果tblCustomerSales有1亿条记录呢?我考虑将其作为替代方案,问题是这需要一段时间才能实现。这种优化将导致数据库架构不再规范化。过早优化是万恶之源。有了适当的索引,max/group by答案就可以了。它看起来像一个olap分析数据库,而不是oltp事务数据库,在这种情况下,它必须被非规范化。按用例!这就是顾客所付的钱。清洁的解决方案不是100%标准化的,而是快速实用的。如果tblCustomerSales有1亿条记录呢?我考虑将其作为替代方案,问题是这需要一段时间才能实现
如果速度太慢,则在custid、prodid和issue上添加索引。我想是这样的。如果速度太慢,那么在custid、prodid和issue上添加一个索引。按照这个顺序,我想,这是我模式的95%。您的最后一张表格是我需要获取每种产品的最后一期的地方,对于一位客户,我将非常感谢您的反馈。这是我的模式的95%。您的最后一张桌子是我需要获得每种产品最后一期的地方,对于一位客户,我将非常感谢您的反馈。