繁体   English   中英

如何从此SELECT中排除重复项?

[英]How can I exclude duplicates from this SELECT?

这是发票历史记录表中的数据。

invoicehistoryID WorkOrderNumber InvoiceDate

1                1               2017-06-13 12:00:49
2                1               2017-06-13 12:05:05
3                10              2017-06-14 12:32:59
4                10              2017-06-14 14:26:25
5                1               2017-06-14 14:26:54
6                1               2017-06-22 10:12:49

我需要什么SELECT查询来获取每个WorkOrderNumber的最新InvoiceDate(由WorkOrderNumber排序)? 换句话说,我怎么能得到这个:

invoicehistoryID WorkOrderNumber InvoiceDate
6                1               2017-06-22 10:12:49
4                10              2017-06-14 14:26:25

我在DISTINCT上还没有成功。 LIMIT尚未成功,因为我的发票历史记录表将会增长。

这几乎可行,

SELECT max(InvoiceDate),WorkOrderNumber FROM `invoicehistory` GROUP BY WorkOrderNumber

但没有得到invoicehistoryID。
这个

SELECT max(InvoiceDate),WorkOrderNumber, invoicehistoryID FROM `invoicehistory` GROUP BY WorkOrderNumber, invoicehistoryID

返回所有行。

尝试:

SELECT invoicehistoryID, WorkOrderNumber, InvoiceDate
FROM (SELECT invoicehistoryID, WorkOrderNumber, InvoiceDate
  FROM TABLE
  ORDER BY WorkOrderNumber ASC, InvoiceDate DESC
) inv
GROUP BY WorkOrderNumber
  • 集合D:是每个工单的最大发票日期。
  • 设置IH是整个发票历史记录。

通过在日期和订单数字上将D加入IH,我们可以获取缺少的invoicehistoryID和其他信息(如果需要)。

SELECT IH.invoiceHistoryID, IH.WorkOrderNumber, IH.InvoiceDate
FROM InvoiceHistory IH
INNER JOIN (SELECT max(invoiceDate) mInvoiceDate, WorkOrderNumber
            FROM invoicehistory
            GROUP BY workorderNumber) D
 on D.mInvoiceDate = IH.InvoiceDate
and D.WorkOrderNumber = IH.workOrderNumber

如果mySQL支持,交叉应用将是实现此目标的另一种方法

或使用窗口函数分配行号并将结果限制为最新日期(如果mySQL支持)。

在ms sql中得到答案之前,我没有注意到mySql:

 CREATE TABLE #tmp(
    InvoiceHistoryID  INT,
    WorkOrderNumber INT,
    InvoiceDate datetime
    )

   INSERT INTO #tmp VALUES(1,1,'2017-06-13 12:00:49')
   INSERT INTO #tmp VALUES(2,1,'2017-06-13 12:05:05')
   INSERT INTO #tmp VALUES(3,10,'2017-06-14 12:32:59')
   INSERT INTO #tmp VALUES(4,10,'2017-06-14 12:32:59')
   INSERT INTO #tmp VALUES(5,1,'2017-06-14 14:26:54')
   INSERT INTO #tmp VALUES(6,1,'2017-06-22 10:12:49')


    SELECT 
       t.InvoiceHistoryID,
       t.WorkOrderNumber,
       m.InvoiceDate
    FROM #tmp t JOIN (SELECT MAX(InvoiceHistoryID) AS  InvoiceHistoryID, 
                             MAX(InvoiceDate) AS InvoiceDate
                    FROM #tmp 
                    GROUP BY WorkOrderNumber ) AS m 
    ON t.InvoiceHistoryID = m.InvoiceHistoryID                  

    DROP TABLE #tmp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM