简体   繁体   English

使用分区依据的SQL查询

[英]SQL Query using Partition By

I have following table name JobTitle 我有以下表名JobTitle

JobID LanaguageID
-----------------
1         1
1         2
1         3
2         1
2         2 
3         4
4         5
5         2

I am selecting all records from table except duplicate JobID's for which count > 1. I am selecting only one record/first row from the duplicate JobID's. 我从表中选择所有记录,除了重复JobID的计数> 1。我只从重复的JobID中选择一个记录/第一行。 Now I am passing LanguageID as paramter to stored procedure and I want to select duplicate JobID for that languageID along with the other records Also. 现在我将LanguageID作为参数传递给存储过程,我想为该languageID选择重复的JobID以及其他记录。 If I have passed languageID as 1 then output should come as follows 如果我已将languageID作为1传递,则输出应如下所示

JobID LanaguageID
-----------------
1         1
2         1
3         4
4         5
5         2

I have tried using following query. 我尝试过使用以下查询。

with CTE_RN as
(
    SELECT ROW_NUMBER() OVER(PARTITION BY JobTitle.JobID ORDER BY JobTitle.JobTitle) AS RN
    FROM JobTitle
    INNER JOIN JobTitle_Lang
        ON JobTitle.JobTitleID = JobTitle_Lang.JobTitleID
)

But I am unable to use WHERE clause in the above query. 但我无法在上面的查询中使用WHERE子句。 Is any different approch should be followed. 是否应遵循任何不同的方法。 Or else how can i modify the query to get the desired output 或者我如何修改查询以获得所需的输出

with CTE_RN as
(
    SELECT
        JobID, LanaguageID,
        ROW_NUMBER() OVER(PARTITION BY JobTitle.JobID ORDER BY JobTitle.JobTitle) AS RN
    FROM JobTitle
        INNER JOIN JobTitle_Lang ON JobTitle.JobTitleID = JobTitle_Lang.JobTitleID
)
select
from CTE_RN
where RN = 1 or LanguageID = @LanguageID

update 更新

simplified a bit (join removed), but you'll get the idea: 简化了一点(加入删除),但你会明白:

declare @LanguageID int = 2

;with cte_rn as
(
    select
        JobID, LanguageID,
        row_number() over(
          partition by JobTitle.JobID
          order by
              case when LanguageID = @LanguageID then 0 else 1 end, 
              LanguageID
        ) as rn
    from JobTitle
)
select *
from cte_rn
where rn = 1

sql fiddle demo sql小提琴演示

SELECT b.[JobID], b.[LanaguageID]
FROM
  (SELECT a.[JobID], a.[LanaguageID],
    ROW_NUMBER() OVER(PARTITION BY a.[JobID] ORDER BY a.[LanaguageID]) AS [row]
  FROM [JobTitle] a) b
WHERE b.[row] = 1

Result 结果

| JOBID | LANAGUAGEID |
--------|-------------|
|     1 |           1 |
|     2 |           1 |
|     3 |           4 |
|     4 |           5 |
|     5 |           2 |

See a demo 看演示

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

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