sql-server - ROW_NUMBER() 与 DISTINCT

标签 sql-server tsql select

如果我在以下查询中将 ROW_NUMBER() 与 DISTINCT 一起使用,我会遇到问题 我有两种情况: 1-直接运行此查询:例如给我 400 条记录作为结果 2-取消注释以 [--Uncomment1--] 开头的行:结果给我 700 条记录 它复制了一些记录而不是所有记录

我想要的是解决这个问题,或者找到任何方法在每行旁边显示行计数器,以创建一个 [where rownumber Between 1 and 30] --Uncomment2--

如果我将整个查询放在一个表中,然后对其进行过滤,它可以工作,但仍然很慢

等待任何反馈,我将不胜感激

提前致谢

SELECT * FROM 
(SELECT Distinct  CRSTask.ID AS TaskID,
      CRSTask.WFLTaskID,
  --Uncomment1--       ROW_NUMBER() OVER (ORDER By  CRSTask.CreateDate asc ) AS RowNum ,
      CRSTask.WFLStatus AS Task_WFLStatus,
      CRSTask.Name AS StepName,
      CRSTask.ModifiedDate AS Task_ModifyDate,
      CRSTask.SendingDate AS Task_SendingDate,
      CRSTask.ReceiveDate AS Task_ReceiveDate,
      CRSTask.CreateDate AS Task_CreateDate,
      CRS_Task_Recipient_Vw.Task_CurrentSenderName,
      CRS_Task_Recipient_Vw.Task_SenderName,
      CRS_INFO.ID AS CRS_ID,
      CRS_INFO.ReferenceNumber,
      CRS_INFO.CRSBeneficiaries,

      CRS_INFO.BarCodeNumber,
      ISNULL(dbo.CRS_FNC_GetTaskReceiver(CRSTask.ID), '') + ' ' + ISNULL 

(CRS_Organization.ArName, '') 
     AS OrgName,
      CRS_Info.IncidentID,
      COALESCE(CRS_Subject.ArSubject, 'غير مبين') AS ArSubject,
      COALESCE(CRS_INFO.Subject, 'Blank Subject') AS CRS_Subject,
      CRS_INFO.Mode,
      CRS_Task_Recipient_Vw.ReceiverID,
      CRS_Task_Recipient_Vw.ReceiverType,
      CRS_Task_Recipient_Vw.CC,
      Temp_Portal_Users_View.ID AS CRS_LockedByID,
      Temp_Portal_Users_View.ArabicName AS CRS_LockedByName,
      CRSDraft.ID AS DraftID,
      CRSDraft.Type AS DraftType,
      CASE 
     WHEN CRS_Folder = 1 THEN Task_SenderName
     WHEN CRS_Folder = 2 THEN Task_SenderName
     WHEN CRS_Folder = 3 THEN Task_CurrentSenderName
      END AS SenderName,
      CRS_Task_Folder_Vw.CRS_Folder,
      CRS_INFO.Status,
      CRS_INFO.CRS_Type,
      CRS_Type.arName AS CRS_Type_Name
  FROM   CRS_Task_Folder_Vw
      LEFT OUTER JOIN CRSTask
     ON  CRSTask.ID = CRS_Task_Folder_Vw.TaskID
      LEFT OUTER JOIN CRS_INFO
     ON  CRS_INFO.ID = CRSTask.CRSID
      LEFT OUTER JOIN CRS_Subject
     ON  COALESCE(
       SUBSTRING(
        CRS_INFO.Subject,
        CHARINDEX('_', CRS_INFO.Subject) + 1,
        LEN(CRS_INFO.Subject)
       ),
       'Blank Subject'
      ) = CRS_Subject.ID
      LEFT OUTER JOIN CRSInfoAttribute
     ON  CRS_INFO.ID = CRSInfoAttribute.ID
      LEFT OUTER JOIN CRS_Organization
     ON  CRS_Organization.ID = CRSInfoAttribute.SourceID
      LEFT OUTER JOIN CRS_Type
     ON  CRS_INFO.CRS_Type = CRS_Type.ID
      LEFT OUTER JOIN CRS_Way
     ON  CRS_INFO.CRS_Send_Way = CRS_Way.ID
      LEFT OUTER JOIN CRS_Priority
     ON  CRS_INFO.CRS_Priority_ID = CRS_Priority.ID
      LEFT OUTER JOIN CRS_SecurityLevel
     ON  CRS_INFO.SecurityLevelID = CRS_SecurityLevel.ID
      LEFT OUTER JOIN Portal_Users_View
     ON  Portal_Users_View.ID = CRS_INFO.CRS_Initiator
      LEFT OUTER JOIN AD_DOC_TBL
     ON  CRS_INFO.DocumentID = AD_DOC_TBL.ID
      LEFT OUTER JOIN CRSTask AS Temp_CRSTask
     ON  CRSTask.ParentTask = Temp_CRSTask.ID
      LEFT OUTER JOIN Portal_Users_View AS Temp_Portal_Users_View
     ON  Temp_Portal_Users_View.ID = AD_DOC_TBL.Lock_User_ID
      LEFT OUTER JOIN Portal_Users_View AS Temp1_Portal_Users_View
     ON  Temp1_Portal_Users_View.ID = CRS_INFO.ClosedBy
      LEFT OUTER JOIN CRSDraft
     ON  CRSTask.ID = CRSDraft.TaskID
      LEFT OUTER JOIN CRS_Task_Recipient_Vw
     ON  CRSTask.ID = CRS_Task_Recipient_Vw.TaskID 
      --LEFT OUTER JOIN  CRSTaskReceiverUsers     ON CRSTask.ID = 

CRSTaskReceiverUsers.CRSTaskID AND CRS_Task_Recipient_Vw.ReceiverID = CRSTaskReceiverUsers.ReceiverID

      LEFT OUTER JOIN CRSTaskReceiverUserProfile
     ON  CRSTask.ID = CRSTaskReceiverUserProfile.TaskID
  WHERE  Crs_Info.SUBJECT <> 'Blank Subject'
      AND (CRS_INFO.Subject NOT LIKE '%null%')
      AND CRS_Info.IsDeleted <> 1 
       /* AND CRSTask.WFLStatus <> 6 
       AND CRSTask.WFLStatus <> 8  */
      AND (
        (
         CRS_Task_Recipient_Vw.ReceiverID IN (1, 29)
         AND CRS_Task_Recipient_Vw.ReceiverType IN (1, 3, 4)
        )
       )
      AND 1 = 1

)Codes
--Uncomment2--  WHERE Codes.RowNum BETWEEN 1 AND 30
ORDER BY
       Codes.Task_CreateDate ASC

最佳答案

如果问题是您有重复的行,并且 DISTINCT 失败,因为序数行号使每行都是唯一的;尝试(使用DISTINCT):

DENSE_RANK() OVER (ORDER By CRSTask.CreateDate asc)

您还可以删除 CTE 中的 DISTINCTGROUP BY 所有内容。

关于sql-server - ROW_NUMBER() 与 DISTINCT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2635665/

相关文章:

mysql 不使用 Order by using DESC 进行排序

sql-server - 选择顶部到不同的变量中

sql-server - 如何在没有主键的情况下唯一标识表中的行

c++ - QODBC3 无法绑定(bind)到变量

SQL:至少出现两次的元素数

sql - 两个值如何相等但又不相等?

c# - 我可以在 Entity Framework SubQuery 中使用扩展方法吗?

SQL Server 连接问题

c# - 使用来自两个数据库的自动增量ID连接来自两个表的数据

sql - MySQL:如何获得最多胜利的用户?