![](/img/trans.png)
[英]SQL Server function ROW_NUMBER() OVER (PARTITION BY not calc
[英]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
原始數據:
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
如果ProcessedDate
是DATETIME
類型,你可以這樣做
SELECT
pid,
ROW_NUMBER() OVER (
PARTITION BY pid, convert(date, ProcessedDate)
ORDER BY pid, ProcessedDate
) AppNo,
ProcessedDate
FROM table
如果ProcessedDate
是VARCHAR
類型,你可以這樣做
;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.