簡體   English   中英

我需要一個分區上的 Row_number 來在 SQL 服務器中實現這一點

[英]I need a Row_number over partition to achieve this in SQL Server

我有三列 PID、AppNo 和 ProcessedDate 我需要一個查詢來更新以下格式的 AppNo

PID AppNo   ProcessedDate
11  1      09/30/2019 18:21
3   1      09/25/2019 08:37
3   2      09/25/2019 08:37
11  1      09/25/2019 08:39
11  2      09/25/2019 08:40
7   1      09/26/2019 14:19
7   2      09/26/2019 14:20
7   3      09/26/2019 14:22
2   1      09/26/2019 14:23
11  1      09/26/2019 14:23
11  2      09/26/2019 14:24
11  3      09/26/2019 14:24
3   1      09/26/2019 14:24

現在 AppNo 列是 null。

這是不工作的 sql

SELECT AppNo, ProcessedDate,pid
,Row_Number() OVER(PARTITION BY pid, ProcessedDate ORDER BY ProcessedDate) AS rn
select * FROM table 

您似乎正在尋找更新原始表格。 您可以在 CTE 中使用ROW_NUMBER()對具有相同日期(無時間)和 pid 的組的記錄進行排名,按日期(有時間)排序,然后即時進行更新:

WITH cte AS (
    SELECT 
        pid, 
        ProcessedDate, 
        AppNo, 
        ROW_NUMBER() OVER(PARTITION BY pid, CAST(ProcessedDate AS DATE) ORDER BY ProcessedDate) rn 
    FROM mytable
)
UPDATE cte SET AppNo = rn

DB Fiddle 上的演示

原始數據:

PID | AppNo | ProcessedDate   
--: | ----: | :---------------
 11 |  null | 09/30/2019 18:21
  3 |  null | 09/25/2019 08:37
  3 |  null | 09/25/2019 08:37
 11 |  null | 09/25/2019 08:39
 11 |  null | 09/25/2019 08:40
  7 |  null | 09/26/2019 14:19
  7 |  null | 09/26/2019 14:20
  7 |  null | 09/26/2019 14:22
  2 |  null | 09/26/2019 14:23
 11 |  null | 09/26/2019 14:23
 11 |  null | 09/26/2019 14:24
 11 |  null | 09/26/2019 14:24
  3 |  null | 09/26/2019 14:24

運行查詢后:

PID | AppNo | ProcessedDate   
--: | ----: | :---------------
 11 |     1 | 09/30/2019 18:21
  3 |     1 | 09/25/2019 08:37
  3 |     2 | 09/25/2019 08:37
 11 |     1 | 09/25/2019 08:39
 11 |     2 | 09/25/2019 08:40
  7 |     1 | 09/26/2019 14:19
  7 |     2 | 09/26/2019 14:20
  7 |     3 | 09/26/2019 14:22
  2 |     1 | 09/26/2019 14:23
 11 |     1 | 09/26/2019 14:23
 11 |     2 | 09/26/2019 14:24
 11 |     3 | 09/26/2019 14:24
  3 |     1 | 09/26/2019 14:24

詢問。

SELECT pid as ProjectID
  , Row_Number() OVER(PARTITION BY pid, ProcessedDate ORDER BY ProcessedDate) AS AppNo
  , ProcessedDate
FROM table

如果 row_number 不應將時間考慮為:則將ProcessedDate轉換為日期:

 SELECT AppNo, ProcessedDate,pid
,Row_Number() OVER(PARTITION BY pid, convert (date,ProcessedDate) 
                   ORDER BY ProcessedDate) AS rn
from @T

您可以將更新編寫為:

with CTE as(
SELECT  ProcessedDate,pid
,Row_Number() OVER(PARTITION BY pid, convert (date,ProcessedDate) 
                   ORDER BY ProcessedDate) AS rn
from Test
    )
    update CTE
    set AppNo = rn

並將結果測試為:

Select AppNo , 
       Row_Number() OVER(PARTITION BY pid, convert (date,ProcessedDate) 
                         ORDER BY ProcessedDate) AS rn,
       ProcessedDate,
       pid
from Test

示例代碼在這里..

您必須僅使用帶有日期部分的分區,如下所示:



SELECT AppNo, ProcessedDate,pid
,Row_Number() OVER(PARTITION BY pid, CONVERT(VARCHAR(10), ProcessedDate, 111) ORDER BY ProcessedDate) AS rn
select * FROM table 

如果ProcessedDateDATETIME類型,你可以這樣做

SELECT 
    pid, 
    ROW_NUMBER() OVER (
        PARTITION BY pid, convert(date, ProcessedDate) 
        ORDER BY pid, ProcessedDate
    ) AppNo,
    ProcessedDate
FROM table

如果ProcessedDateVARCHAR類型,你可以這樣做

;WITH
t as (
    SELECT  pid, convert(datetime, ProcessedDate, 120) ProcessedDate
    from table
)
SELECT 
    pid, 
    ROW_NUMBER() OVER (
        PARTITION BY pid, convert(date, ProcessedDate) 
        ORDER BY pid, ProcessedDate
    ) AppNo,
    ProcessedDate
FROM t

暫無
暫無

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

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