在sql中选择每个组的第一行

时间:2013-05-13 19:29:41

标签: sql oracle

我有两张桌子。

1→ SM_Employee

 (1) employeeid   
 (2) roleid
 (3) storeid

2→ SM_SalesRepWorkflow

 (1) workflowid
 (2) Salesrepid   foreign key to employeeid
 (3) QuantityAssigned
 (4) QuantityLeft
 (5) month 
 (6) year

通过这些表,我需要从SalesRepId为CurrentMonth和CurrentYear从SM_SalesRepWorkflow订单中选择每个SalesRep详细信息的第一行。

实施例

Workflowid SalesRepId QuantityAssigned QuantityLeft Month Year

  

WF_101:EMP_101:100:90:May:2013
  WF_101:EMP_102:100:100:May:2013
  WF_101:EMP_103:100:80:May:2013
  WF_102:EMP_101:100:70:May:2013

所以我想要的结果是

  

WF_101:EMP_101:100:90:May:2013
  WF_101:EMP_102:100:100:May:2013
  WF_101:EMP_103:100:80:May:2013

所以SalesRep可以有很多工作流程。 但我希望当前月份和年份的每个SalesRep都有第一个。

2 个答案:

答案 0 :(得分:34)

您可以使用ROW_NUMBER()这样的功能:

SELECT *
  FROM(SELECT workflowid, salesRepId, quantityAssigned,
              quantityLeft, month, year
              , ROW_NUMBER()
                OVER (PARTITION BY salesRepId
                          ORDER BY workflowid) AS rownumber
         FROM sm_salesRepWorkflow)
 WHERE rownumber = 1;

<强> Fiddle Demo

答案 1 :(得分:0)

我在理解这个问题时遇到了一些麻烦,所以如果我关闭,我会在之后编辑它,但看起来你想做SELECT * FROM SM_SalesRepWorkflow WHERE Workflowid = latest之类的事情,其中​​最新版本是工作流程的ID。也许您可以确定查询的最新内容并将其带入而不是从查询中执行此操作?