计算视图中某些线的总和?

问题描述

我有以下问题:

我有一个视图,其中包含ID,month_date,max_month_date和余额。我现在想做一个自我联接,将id与id进行比较,并将max_month_date与month_date进行比较。因此,仅将具有最大month_date的行写入新视图。 那是起点:

id     month_date    max_month_date     balance 
1      2020-01-12    2020-01-31         100
1      2020-01-16    2020-01-31         150
1      2020-01-31    2020-01-31         200
1      2020-02-03    2020-02-23         100
1      2020-02-23    2020-02-23         150
1      2020-02-23    2020-02-23         -150

因此我的加入是:

SELECT t.main_id,t.month_date,t.max_month_date,t.balance
FROM test_view t
INNER JOIN test_view s 
ON t.main_id = s.main_id
AND t.month_date = s.max_month_date

问题是有些行具有相同的ID和相同的max_month_date。余额是不同的。因此,输出中写了太多行。

从理论上讲,我将必须总计所有具有相同ID和相同max_month_date的余额。 在上述情况下,这适用于最后两行:

    id     month_date    max_month_date     balance
    1      2020-02-23    2020-02-23         0 

然后,必须在主视图中删除重复的数据记录,并仅用构成余额总数的行填充。 像这样:

    id     month_date    max_month_date     balance
    1      2020-01-12    2020-01-31         100
    1      2020-01-16    2020-01-31         150
    1      2020-01-31    2020-01-31         200
    1      2020-02-03    2020-02-23         100
    1      2020-02-23    2020-02-23         0 

有人有什么主意可以帮助我吗?

预先感谢

解决方法

尝试以下操作。COUNT窗口功能可确保将相同的值分组在一起,而不管其为负还是正。然后,如果计数> 1,则BALANCE列按MAIN_ID,MONTH_DATE,MAX_MONTH_DATE分组,否则BALANCE

Working Solution

enter image description here

WITH TEST_VIEW AS (
SELECT 1 MAIN_ID,CONVERT(DATETIME,'2020-01-12',102) AS MONTH_DATE,'2020-01-31',102) AS MAX_MONTH_DATE,100  AS balance  UNION ALL
SELECT 1 MAIN_ID,'2020-01-16',150  AS balance  UNION ALL
SELECT 1 MAIN_ID,200  AS balance  UNION ALL
SELECT 1 MAIN_ID,'2020-02-03','2020-02-23',-150 AS balance  
)
SELECT DISTINCT
       T.MAIN_ID,T.MONTH_DATE,T.MAX_MONTH_DATE,CASE
          WHEN BALC > 1
          THEN
             SUM (BALANCE)
                OVER (PARTITION BY T.MAIN_ID,T.MAX_MONTH_DATE)
          ELSE
             BALANCE
       END
          SUMM
  FROM (SELECT T.MAIN_ID,T.BALANCE,COUNT (*)
                  OVER (PARTITION BY T.MAIN_ID,ABS (T.BALANCE))
                  BALC
          FROM TEST_VIEW T) T
,

尝试使用SQL DISTINCT

SELECT DISTINCT t.main_id,t.month_date,t.max_month_date,t.balance
FROM test_view t
INNER JOIN test_view s 
ON t.main_id = s.main_id
AND t.month_date = s.max_month_date
,

您只需要一个WHERE子句:

SELECT t.main_id,t.balance
FROM test_view t
WHERE t.month_date = t.max_month_date;

不需要JOIN

如果视图没有max_month_date,则可以使用窗口函数来计算它:

SELECT t.main_id,t.balance
FROM (SELECT t.*,MAX(month_date) OVER (PARTITION BY main_id) as max_month_date
      FROM test_view t
     ) t
WHERE t.month_date = t.max_month_date;