我在SQL Server数据库中有3个表
当我加入这3个表时,我想获取 distinct/unique
行。
为此,我在distinct
查询后使用SELECT
关键字,但它不起作用。
它仍会在SELECT
查询中返回重复记录(即ID, Column1, Column2
所有记录都在重复,因为3个表中的1个表中已存在重复记录)
请告诉我如何加入3个表并返回unique/distinct
行
请回复
修改:以下是我当前的查询以及结果集:
请检查返回的结果。它中有重复的记录。
编辑2: 真的很抱歉上面的困惑。请查看此部分:
如果假设其中一个Join表给出了以下结果集(暂时忽略黄色文本):
要求:
现在,我想从上面的结果集中选择以下格式的记录:
Action = Submit
记录/行将显示在SELECT查询中。Action = Latest Resubmit
(多次重新提交)
记录/行应显示在SELECT查询中。Action = Latest Resubmit
(在多个重新提交中)记录/行中的数据应显示在SELECT查询中。Action = Resubmit
记录/行应显示在SELECT查询中。Action = Submit
记录/行将显示在SELECT查询中。以上"等"意味着,除了' Save'以外的操作 ,'提交' ,'重新提交'
为了满足上述要求(黄色文本,基于上述要求),我尝试了以下查询:
Select distinct R.RequestID, R.BarcodeNo, W.Action, W.CreatedDate
INTO #TempTable
From [Sunway_AP].[Invoice].[tbl_Request] (NOLOCK) R
Left Join [Sunway_AP].[Invoice].[tbl_Xml](NOLOCK) X On X.XmlID = R.XmlID
Left Join [Sunway_AP].[Invoice].[tbl_WorkflowHistory] (NOLOCK) W On W.RequestID = R.RequestID
order by R.RequestID
SELECT * FROM
(
SELECT distinct * FROM (SELECT distinct *, ROW_NUMBER() OVER(PARTITION BY RequestID ORDER BY CreatedDate desc) RowNumber FROM #TempTable
WHERE [Action] = 'Resubmit') AS t
WHERE RowNumber = 1
UNION ALL
SELECT distinct * FROM (SELECT distinct *, ROW_NUMBER() OVER(PARTITION BY RequestID ORDER BY CreatedDate desc) RowNumber FROM #TempTable
WHERE [Action] = 'Save'
AND RequestID NOT IN (SELECT DISTINCT RequestID FROM #TempTable WHERE [action] = 'Submit')
AND RequestID NOT IN (SELECT DISTINCT RequestID FROM #TempTable WHERE [action] = 'Resubmit')) AS t
WHERE RowNumber = 1
UNION ALL
SELECT distinct * FROM (SELECT distinct *, ROW_NUMBER() OVER(PARTITION BY RequestID ORDER BY CreatedDate desc) RowNumber FROM #TempTable
WHERE [Action] = 'Submit'
AND RequestID NOT IN (SELECT DISTINCT RequestID FROM #TempTable WHERE [action] = 'Resubmit')) AS t
WHERE RowNumber = 1
) AS a
order by RequestID
但它没有给我预期的结果。 请让我知道在查询中我应该更改哪些内容以获得所需的输出?
答案 0 :(得分:0)
您报告的原因显示"重复"是因为你的行动专栏
正在使前两列重复,因为他们对这些代码的不同操作都会多次显示多个动作
如果删除操作列,则每个代码只会看到一行
答案 1 :(得分:0)
与您所使用的给定数据集不是真正不同的行,因此DISTINCT不适合您。相反,您需要对记录进行排名,并且只显示给定requestid / barcodeno组合的“最佳”。在SQL中,您将使用ROW_NUMBER()对它们进行排名,给出最佳记录row_number#1,第二个最佳#2,依此类推。然后你只保留#1,就是这样。
在您的情况下(>
表示“首选”):最近重新提交>早些时候重新提交>提交>保存
select requestid, barcodeno, action, createddate
from
(
select
r.requestid,
r.barcodeno,
w.action,
w.createddate,
row_number() over
(
partition by requestid, barcodeno
order by
case w.action
when 'Save' then 1
when 'Submit' then 2
when 'Resubmit' then 3
else 0
end desc, w.createddate desc
) as rn
from tbl_request r
join tbl_xml x on x.xmlid = r.xmlid
join tbl_workflowhistory w on w.requestid = x.requestid
) ranked
where rn = 1;