查询以获取MS SQL Server的特定行:
我有一个奇怪的要求。在下表中,我有供应商编号、法案编号、零件编号和移动日期。我想选择零件号的行。在U13进入之前的最后一个零件号有最近的U13零件号移动日期的过去移动日期每个动作的零件号 样本:查询以获取MS SQL Server的特定行:,sql,sql-server,sql-server-2005,group-by,Sql,Sql Server,Sql Server 2005,Group By,我有一个奇怪的要求。在下表中,我有供应商编号、法案编号、零件编号和移动日期。我想选择零件号的行。在U13进入之前的最后一个零件号有最近的U13零件号移动日期的过去移动日期每个动作的零件号 样本: 1. Vendor_No Act_num Part_Num Movein_Date 2. 708 3321386 T01 2/19/2012 3. 708 3321386 U13 2/15/2012 4. 708 3321386 U01 2/1/2
1. Vendor_No Act_num Part_Num Movein_Date
2. 708 3321386 T01 2/19/2012
3. 708 3321386 U13 2/15/2012
4. 708 3321386 U01 2/1/2012
5. 708 3321386 T14 1/31/2012
6. 708 3321386 Y10 1/30/2012
7. 708 3321386 U05 12/31/2011
8. 106 3852820 U13 12/30/2012
9. 106 3852820 T28 12/28/2012
10. 106 3852820 U09 11/12/2012
11. 106 3852820 U01 10/24/2012
12. 106 3852820 T09 4/21/2012
13. 472 3925527 U14 8/3/2012
14. 472 3925527 U13 7/3/2012
15. 472 3925527 T01 1/6/2012
16. 472 3925527 T05 1/6/2012
17. 472 3925527 T14 6/12/2011
18. 472 3925527 U01 5/31/2011
19. 685 4938653 U13 1/28/2013
20. 685 4938653 W20 1/20/2013
21. 685 4938653 U01 1/2/2013
22. 685 4938653 W17 12/25/2012
23. 685 4938653 T05 12/20/2012
结果我需要:
1. Vendor_No Act_num Part_Num Movein_Date
2. 708 3321386 U01 2/1/2012
3. 106 3852820 T28 12/28/2012
4. 472 3925527 T01 1/6/2012
5. 472 3925527 T05 1/6/2012
6. 685 4938653 W20 1/20/2013
如果我不清楚,请告诉我 我手头没有数据库,但在我脑海中,像这样的东西应该可以为您提供基本数据,您需要更改myTable中的tablename:
Select Act_num, max(Movein_date) maxdate
from myTable
where Movein_date < (Select max(Movein_date) from myTable where part_num = 'U13')
and part_num != 'U13'
group by Act_num
然后将其连接回自身,将得到最终的数据集:
Select *
from myTable tab1
inner join (
Select Act_num, max(Movein_date) maxdate
from myTable
where Movein_date < (Select max(Movein_date) from myTable where part_num = 'U13')
group by Act_num
) tab2
on tab1.Act_num = tab2.Act_Num and tab1.Movein_date = tab2.maxdate
一种方法是使用秩函数:
SELECT *
FROM (SELECT *, RANK () OVER(PARTITION BY ACT_NUM ORDER BY Movein_Date DESC)'RowRank'
FROM Table1
)a
JOIN (SELECT *, RANK () OVER(PARTITION BY ACT_NUM ORDER BY Movein_Date DESC)'RowRank'
FROM Table1
)b
ON a.RowRank = b.RowRank +1
AND a.ACT_NUM = b.ACT_NUM
AND b.Part_Num = 'U13'
排名基本上只是根据Movein_日期对行进行编号,然后通过在RowRank+1上加入,可以获得一行偏移量
下面是一个演示:
注意:忽略“ID”字段,它只是从示例复制过来的行号
编辑:丢失了每个帐号部分,已修复。您的SQL Server版本是什么?我正在使用2008R2进行查询,但我认为数据库是在2005年设置的。我收到错误:子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。请立即尝试,只需更改子查询并更正列名即可。谢谢你的帮助!!!我想知道是否有任何书籍或网站有这样的练习问题。当涉及到聚合、子查询时,我对这类查询非常感兴趣。如果你知道,请帮忙。再次感谢您对我的帮助。当我学习tsql时,我最喜欢的tsql书籍是ken hendersons-专家指南Transact-SQL,它现在可能有点过时,但它很小,几天内就可以读完。我在乔·塞尔科斯的书中也看到了很多好东西。谢谢你的回复。我要找这些书。非常感谢。我还没有试过这个问题。但当我有空闲时间下班时,我会试试看。谢谢你的答复