如何确定连续几年发生的事件?

时间:2019-06-18 17:41:23

标签: sql if-statement sas conditional-statements

我试图逐月弄清楚是否在前三年连续发生过事件。例如:

Item     Type      Month      Year
Hat        S         May       2015
Shirt      P         June      2015
Hat        S         June      2015
Hat        S         May       2016
Shirt      P         May       2016
Hat        S         May       2017

我有兴趣查看同一个月连续三年购买/出售的商品。帽子分别于2015年,2016年和2017年5月售出;因此,我想指出这一点。衬衫是在2015年6月和2016年5月购买的。由于这是连续几年的不同月份,因此不符合条件。

从本质上讲,我希望它能够回顾3年并确定每年同一月再次发生的购买/销售,最好是使用指标变量。

我尝试了以下代码:

select distinct a.*
from dataset as a inner join dataset as b 
on a.type = b.type
and a.month = b.month
and a.item = b.item
and a.year = b.year-1 
and a.year = b.year-2;

我想得到:

Item     Type      Month      Year
Hat        S         May       2015
Hat        S         May       2016
Hat        S         May       2017

我想我应该补充一点,就是我的数据比2015-2017年更长。它跨越10年,但是我想看看在这10年中是否有连续3年(或更长时间)。

2 个答案:

答案 0 :(得分:0)

执行此操作的方法有很多,但是,在SQL中,一种可以将Item限制为Month的方式是对行可以按Year2015进行分组的关键理解。 2017select item, type, month, year from have where year between 2015 and 2017 group by item, month having count(distinct year) = 3 order by item, type, month, year 之间的三年。为了连续获得3个资格,该组中年份的不同值的计数应为3。此类条件将重复处理数据,例如,具有3个S型帽子和3个P型帽子的组。

rungroup

对于识别组中运行的更常见的问题,SAS Data步骤非常适合且功能强大。串行DOW循环技术首先根据某种条件在一定范围的行上循环,同时计算组指标-在这种情况下,是连续的年运行时间。第二秒钟循环遍历相同的行,并利用其中的组度量。

请考虑以下示例,其中data have; do comboid = 1 to 1000; itemid = ceil(10 * ranuni(123)); typeid = ceil(2* ranuni(123)); month = ceil(12 * ranuni(123)); year = 2009 + floor (10 * ranuni(123)); output; end; run; proc sort data=have; by itemid month year; run; data have_rungrouped; set have; by itemid month year; rungroup + (first.month or not first.month and year - lag(year) > 1); run; data want; do index = 1 by 1 until (last.rungroup); set have_rungrouped; by rungroup; * distinct number of years in rungroup; years_runlength = sum (years_runlength, first.rungroup or year ne lag(year)); end; do index = 1 to index; set have_rungrouped; if years_runlength >= 3 then output; end; run; 是根据项目/月份的年份邻接度计算的。建立运行组后,将应用双重DOW技术。

create-react-app

答案 1 :(得分:0)

下面是一个示例,该示例将检查连续几年中是否发生了任何项目,并列出至少连续两年有资格的原始表中的所有项目:

DECLARE @table TABLE
(
    Item NVARCHAR(MAX),
    Type CHAR,
    Month NVARCHAR(MAX),
    Year INT
)

INSERT INTO @table VALUES
('Hat','S','May','2015'),
('Shirt','P','June','2015'),
('Hat','S','June','2015'),
('Hat','S','May','2016'),
('Shirt','P','May','2016'),
('Hat','S','May','2017')

SELECT * FROM @table
WHERE CONCAT(Item,Month) IN 
(
    SELECT CONCAT(group1.Item, group1.Month) FROM
    (
        SELECT Item,Year,Month FROM @table
        GROUP BY Year, Item, Month
    ) group1
    FULL OUTER JOIN 
    (
        SELECT Item,Year,Month FROM @table
        GROUP BY Year, Item, Month
    ) group2
    ON group1.Year = group2.Year + 1 AND group1.Item = group2.Item AND group1.Month = group2.Month
    WHERE group1.Item IS NOT NULL AND group2.Item IS NOT NULL
)
ORDER BY Item,Month,Year

如您所见,我发现同一个月中所有匹配年份+ 1的项目。

输出:

Hat S   May 2015
Hat S   May 2016
Hat S   May 2017