SQL Server SQL计数连续行

c2e8gylq  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(151)

我有一个SQL表,我需要计算0营业额的行数,但挑战是他们重置。我只需要自上次产生任何营业额以来的连续行数。
源数据(它有很多不同的ID,在本例中仅使用442和4500):

ID         |Date       |  T/O | 
442        |2019-12-31 |    0 |
442        |2020-01-01 |200.00|
442        |2020-01-02 |    0 |
442        |2020-02-06 |    0 |
442        |2020-02-07 |    0 |
442        |2020-02-08 |    0 |
442        |2020-02-09 |150.00|
442        |2020-02-10 |    0 |
442        |2020-02-11 |    0 |
442        |2020-02-15 |    0 |
4500       |2020-01-01 |    0 |

预期结果:

442        | 3 |
4500       | 1 |

我曾想过使用LAG(),但是两次交易之间的行数可能会有很大的不同,有时甚至会超过30行。

5vf7fwbs

5vf7fwbs1#

SELECT id, COUNT(*) as [result]
FROM SourceData sd1
WHERE t_o=0 
      AND NOT EXISTS (SELECT 1 
                     FROM SourceData sd2 
                     WHERE sd1.id=sd2.id AND t_o != 0 AND sd2.[Date] > sd1.[Date])
GROUP BY id

演示

eivgtgni

eivgtgni2#

首先,我们可以获取每个id的最后一个非零日期。

select id, max(date) as date
from example
where t_o > 0
group by id

这将不会显示4500的值,因为它缺少非零值。
然后,我们可以使用它来选择和分组那些日期之后的值,或者如果id没有非零日期,则选择和分组所有行。

with last_to as(
  select id, max(date) as date
  from example
  where t_o > 0
  group by id
)
select example.id, count(example.t_o)
from example
-- Use a left join to get all ids in example,
-- even those missing from last_to.
left join last_to on last_to.id = example.id
-- Account for the lack of a last_to row
-- if the ID has no non-zero values.
where last_to.date is null
   or example.date > last_to.date
group by example.id

Demonstration.

相关问题