簡體   English   中英

使用分區依據的SQL查詢

[英]SQL Query using Partition By

我有以下表名JobTitle

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

我從表中選擇所有記錄,除了重復JobID的計數> 1。我只從重復的JobID中選擇一個記錄/第一行。 現在我將LanguageID作為參數傳遞給存儲過程,我想為該languageID選擇重復的JobID以及其他記錄。 如果我已將languageID作為1傳遞,則輸出應如下所示

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

我嘗試過使用以下查詢。

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
)

但我無法在上面的查詢中使用WHERE子句。 是否應遵循任何不同的方法。 或者我如何修改查詢以獲得所需的輸出

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

更新

簡化了一點(加入刪除),但你會明白:

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小提琴演示

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

結果

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

看演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM