Мне нужно Row_number над разделом для достижения этого в SQL Server - PullRequest
0 голосов
/ 02 октября 2019

У меня есть три столбца 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 

image

Ответы [ 5 ]

0 голосов
/ 02 октября 2019

, если 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
0 голосов
/ 02 октября 2019

Вы должны использовать раздел только с частью даты, как это:



SELECT AppNo, ProcessedDate,pid
,Row_Number() OVER(PARTITION BY pid, CONVERT(VARCHAR(10), ProcessedDate, 111) ORDER BY ProcessedDate) AS rn
select * FROM table 
0 голосов
/ 02 октября 2019

конвертировать ProcessedDate в дату, если row_number не должен учитывать время как:

 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

Пример кода здесь ..

0 голосов
/ 02 октября 2019

Вы, похоже, хотите обновить исходную таблицу. Вы можете использовать ROW_NUMBER() в CTE для ранжирования записей с группами, имеющими одинаковую дату (без времени) и 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

Демонстрация на БД Fiddle

Исходные данные:

PID | AppNo | ProcessedDate   
--: | ----: | :---------------
 11 |  <em>null</em> | 09/30/2019 18:21
  3 |  <em>null</em> | 09/25/2019 08:37
  3 |  <em>null</em> | 09/25/2019 08:37
 11 |  <em>null</em> | 09/25/2019 08:39
 11 |  <em>null</em> | 09/25/2019 08:40
  7 |  <em>null</em> | 09/26/2019 14:19
  7 |  <em>null</em> | 09/26/2019 14:20
  7 |  <em>null</em> | 09/26/2019 14:22
  2 |  <em>null</em> | 09/26/2019 14:23
 11 |  <em>null</em> | 09/26/2019 14:23
 11 |  <em>null</em> | 09/26/2019 14:24
 11 |  <em>null</em> | 09/26/2019 14:24
  3 |  <em>null</em> | 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
0 голосов
/ 02 октября 2019

Запрос.

SELECT pid as ProjectID
  , Row_Number() OVER(PARTITION BY pid, ProcessedDate ORDER BY ProcessedDate) AS AppNo
  , ProcessedDate
FROM table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...