SQL - определение того, как долго аккаунт не был оплачен - PullRequest
0 голосов
/ 09 октября 2018

У меня есть таблица ниже:

+--------+------+---------+------------+
|   ID   | TEAM | WEEK_NO | Money_paid |
+--------+------+---------+------------+
| 112233 | AA   |  201801 |        100 |
| 112233 | BB   |  201801 |          0 |
| 112233 | BB   |  201802 |          0 |
| 112233 | BB   |  201803 |          0 |
| 454545 | AA   |  201801 |        100 |
| 658855 | BB   |  201802 |        100 |
| 658855 | BB   |  201802 |        100 |
| 112233 | BB   |  201809 |          0 |
+--------+------+---------+------------+ 

, и я хочу получить результат, подобный таблице ниже, с этим правилом, которое подсчитывает число последовательных week_no.s, где Money_paid одинакова.Это было в последовательном порядке:

+--------+------+---------+------------+-------+
|   ID   | TEAM | WEEK_NO | Money_paid | Count |
+--------+------+---------+------------+-------+
| 112233 | AA   |  201801 |        100 |     1 |
| 112233 | BB   |  201801 |          0 |     3 |
| 112233 | BB   |  201802 |          0 |     3 |
| 112233 | BB   |  201803 |          0 |     3 |
| 454545 | AA   |  201801 |        100 |     1 |
| 658855 | BB   |  201802 |        100 |     1 |
| 112233 | BB   |  201809 |          0 |     1 |
+--------+------+---------+------------+-------+

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

select top 10 
    Concat(TEAM, ID) AS Concatbu_ac, count(*) 
from 
    (select 
         *,
         (row_number() over (order by week_no) -
          row_number() over (partition by Concat(team, ID) order by week_no)
         ) as group5
     from 
         table5) t
group by 
    group5, Concat(team, ID);

1 Ответ

0 голосов
/ 09 октября 2018

Если я правильно понимаю, вы хотите считать неделю на основе суммы, уплаченной ID & Team.Идея состоит в том, чтобы посчитать группу записей по ID, Team, Money_Paid, а затем самостоятельно объединить по уникальному столбцу.Надеюсь, что это ответ на ваш вопрос.

DECLARE @dataset TABLE (
    ID INT,
    Team VARCHAR(10),
    Week_No INT,
    Money_Paid INT
)

INSERT INTO @dataset SELECT 112233, 'AA', 201801, 100
INSERT INTO @dataset SELECT 112233, 'BB', 201801, 0
INSERT INTO @dataset SELECT 112233, 'BB', 201802, 0
INSERT INTO @dataset SELECT 112233, 'BB', 201803, 0
INSERT INTO @dataset SELECT 454545, 'AA', 201801, 100
INSERT INTO @dataset SELECT 658855, 'BB', 201802, 100 --duplicate
INSERT INTO @dataset SELECT 658855, 'BB', 201802, 100 --duplicate
INSERT INTO @dataset SELECT 112233, 'BB', 201809, 0

--week count
SELECT 
    ds.*,
    x.WeekCount
FROM @dataset ds
JOIN (
    SELECT 
        ID, 
        Team,
        COUNT(Week_No) AS WeekCount
    FROM @dataset
    GROUP BY ID, Team, Money_Paid
) x
ON ds.ID = x.ID
AND ds.Team = x.Team
ORDER BY ID, Team, Week_No

--week to date
SELECT 
    ds.*,
    COUNT(*) OVER (PARTITION BY ID, Team, Money_Paid ORDER BY ID, Team, Week_No) AS WeekToDate
FROM @dataset ds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...