SQL查询建议 - 获取上一个项目

时间:2009-01-07 07:27:35

标签: sql sql-server

我问了相反的问题here,现在我面临另一个问题。假设我有以下表格(根据上一篇文章中的海报)


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

如何通过WeekDay名称从表3中获取所有问题的上一期(publishdate)?今天(星期三)的重要问题不是昨天的星期二,而是星期三的星期三。结果将是3列。产品名称,当前问题(PublishDate)和上一期(PublishDate)。

由于

编辑〜这是我面临的一个问题。如果前一个问题不存在,它也必须回到pror周。我尝试了以下作为测试但不起作用

SELECT TOP 1 publishdate FROM dbo.issue 
WHERE prodid = 123 AND datename(dw,publishdate) = datename(dw,'2008-12-31') 
ORDER BY publishdate desc

这是在SQL Server 2000上。

6 个答案:

答案 0 :(得分:1)

可以假设IssueID正确排序,即。每个下一个问题的ID都会大1?

在这种情况下,这样的事情应该有效:

SELECT Curr.ProdID, Curr.PublishDate As CurrentIssue, Prev.PublishDate AS PrevIssue
FROM Issues Curr, Issues Prev
WHERE ProdID=123 AND Curr.PublishDate='12/06/2008' AND Prev.IssueID=Curr.IssueID - 1

否则需要一种方法来确定哪个日期对于上一个问题(上周,上个月?)是正确的,并使用带有日期减法的subselect。

P.S。如果您还包含表的名称以便于参考,并且还指定了您正在使用的SQL服务器,那将是很好的,例如,日期函数语法在它们之间变化很大。

答案 1 :(得分:1)

可能类似(语法可能不正确)

select ProdID, IssueID, max(PublishDate) 
where PublishDate<'2008-1-1'
group by ProdID, IssueID

答案 2 :(得分:1)

您可以使用像这样的子查询

(SELECT TOP (1) PublishDate From Table3 as newName WHERE newName.PublishDate < PublishDate ORDER BY PublishDate DESC) As PrevDate

我写了这篇文章,您可能还需要过滤产品ID,可能需要更改一些内容。

答案 3 :(得分:1)

我认为你说在这种情况下,你对“上一期”的定义是“上一周同一天出现的问题”。

这可以达到你想要的吗? (调用“表2”产品和“表3”问题。)

SELECT ProdName, current.IssueID, previous.IssueID
  FROM products, issues current, issues previous
  WHERE current.prodID = products.prodID
    AND previous.prodID = current.prodID
    AND previous.publishDate = current.publishDate - 7;

目前尚不清楚您是否希望将此信息用于最新问题,本周所有问题或所有问题。您可以在current.publishDate上添加条件,以限制查看哪些“当前”问题。

我假设以前的问题始终存在。如果它可能没有(某些产品跳过几天),您可能需要在“当前”和“上一个”之间进行外部联接。

答案 4 :(得分:0)

使用ROW_NUMBER()分析函数(PARTITION BY ProdID ORDER BY PublishDate DESC)。将MAX(PublishDate)与给定分析函数的值为2的行组合在一起。

它适用于Oracle,并且SQL Server规范似乎与此函数相同,因此它应该可以正常工作。

答案 5 :(得分:0)

今天或昨天或前一天是否存在问题不应成为问题。你有一个包含publishDates的集合。您知道所有有效的publishDates。所以你想要这个集合中最大的publishDate,其中publishDate小于今天的日期。