我问了相反的问题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上。
答案 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小于今天的日期。