Перевод условной оконной функции RANK из SQL в Pandas - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь перевести оконную функцию из SQL в Pandas, которая применяется только при условии, что совпадение возможно - в противном случае вставляется значение NULL (None).

SQL-код (пример)

SELECT 
    [ID_customer]
    [cTimestamp]
    [TMP_Latest_request].[ID_req] AS [ID of Latest request]
FROM [table].[Customer] AS [Customer]
LEFT JOIN (
    SELECT * FROM(
        SELECT [ID_req], [ID_customer], [rTimestamp], 
        RANK() OVER(PARTITION BY ID_customer ORDER BY rTimestamp DESC) as rnk
        FROM [table].[Customer_request]
    ) AS [Q]
    WHERE rnk = 1
) AS [TMP_Latest_request]
ON [Customer].[ID_customer] = [TMP_Latest_request].[ID_customer]

Пример

Присоединение идентификатора последнего запроса клиента (если существует) к клиенту.

table:Customer
+-------------+------------+
| ID_customer | cTimestamp |
+-------------+------------+
|           1 |       2014 |
|           2 |       2014 |
|           3 |       2015 |
+-------------+------------+

table: Customer_request
+--------+-------------+------------+
| ID_req | ID_customer | rTimestamp |
+--------+-------------+------------+
|      1 |           1 |       2012 |
|      2 |           1 |       2013 |
|      3 |           1 |       2014 |
|      4 |           2 |       2014 |
+--------+-------------+------------+

Result: table:merged
+-------------+------------+----------------------+
| ID_customer | cTimestamp | ID of Latest request |
+-------------+------------+----------------------+
|           1 |       2014 | 3                    |
|           2 |       2014 | 4                    |
|           3 |       2015 | None/NULL            |
+-------------+------------+----------------------+

Что такое эквивалент в Python Pandas?

1 Ответ

0 голосов
/ 06 ноября 2019

Вместо использования функции RANK(), вы можете просто использовать нижеприведенное, и его легко конвертировать.

SELECT A.ID_Customer,A.cTimeStamp,B.ID_req
FROM Customer A
LEFT JOIN (
    SELECT ID_Customer,MAX(ID_req)ID_req 
    FROM Customer_request
    GROUP BY ID_Customer
   )B
ON A.ID_Customer = B.ID_Customer

Попробуйте следующий запрос: если у вас возникли какие-либо проблемы, спросите меня вкомментарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...