我试图逐月弄清楚是否在前三年连续发生过事件。例如:
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年(或更长时间)。
答案 0 :(得分:0)
执行此操作的方法有很多,但是,在SQL中,一种可以将Item
限制为Month
的方式是对行可以按Year
和2015
进行分组的关键理解。 2017
至select 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