![](/img/trans.png)
[英]How Can I Select Rows from MySQL Without Including Duplicates Across Two Columns
[英]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,我们可以获取缺少的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.