Tsql T-SQL迭代检查历史模式
如何根据项目的先前历史进行选择 例如,我试图选择一个val为1、以前val为10、以前val为1的项目。应满足以下数据的唯一itemId为itemId=3Tsql T-SQL迭代检查历史模式,tsql,iteration,Tsql,Iteration,如何根据项目的先前历史进行选择 例如,我试图选择一个val为1、以前val为10、以前val为1的项目。应满足以下数据的唯一itemId为itemId=3 WITH Items (itemId, date, val) AS ( SELECT 1, CONVERT(datetime, '5/1/2011'), 6 UNION ALL SELECT 2, CONVERT(datetime, '5/1/2011'), 5 UNION ALL SELECT 3
WITH Items (itemId, date, val) AS (
SELECT 1, CONVERT(datetime, '5/1/2011'), 6 UNION ALL
SELECT 2, CONVERT(datetime, '5/1/2011'), 5 UNION ALL
SELECT 3, CONVERT(datetime, '5/1/2011'), 1 UNION ALL
SELECT 1, CONVERT(datetime, '6/1/2011'), 1 UNION ALL
SELECT 2, CONVERT(datetime, '6/1/2011'), 10 UNION ALL
SELECT 3, CONVERT(datetime, '6/1/2011'), 10 UNION ALL
SELECT 1, CONVERT(datetime, '7/1/2011'), 1 UNION ALL
SELECT 2, CONVERT(datetime, '7/1/2011'), 1 UNION ALL
SELECT 3, CONVERT(datetime, '7/1/2011'), 1
)
select distinct itemId from Items where val = 1
--and a previous date val = 10
--and a previous previous date val = 1
这将得到你想要的具体答案。不过,我不确定它在抽象意义上有多有用。您是否总是要查找正好有3个值(1-10-1)的项目
SELECT
A.itemID
FROM
Items A
INNER JOIN Items B ON A.itemID = B.itemID AND B.val = 10
INNER JOIN Items C ON B.itemID = C.itemID AND C.val = 1
WHERE
A.val = 1
由于您在先前日期上有值要求,因此必须使用ItemId和日期排序 然后在Id上执行两个自联接,并将RowNum联接添加到它之前的一个联接(生效日期为前一日期),然后将
WHERE
子句添加到1-10-1
WITH Items_Original (itemId, date, val) AS
(
SELECT 1, CONVERT(datetime, '5/1/2011'), 6 UNION ALL
SELECT 2, CONVERT(datetime, '5/1/2011'), 5 UNION ALL
SELECT 3, CONVERT(datetime, '5/1/2011'), 1 UNION ALL
SELECT 1, CONVERT(datetime, '6/1/2011'), 1 UNION ALL
SELECT 2, CONVERT(datetime, '6/1/2011'), 10 UNION ALL
SELECT 3, CONVERT(datetime, '6/1/2011'), 10 UNION ALL
SELECT 1, CONVERT(datetime, '7/1/2011'), 1 UNION ALL
SELECT 2, CONVERT(datetime, '7/1/2011'), 1 UNION ALL
SELECT 3, CONVERT(datetime, '7/1/2011'), 1
),
Items As
(
Select
ROW_NUMBER() OVER(ORDER BY ItemId, Date) AS RowNum, *
FROM Items_Original
)
select *
from Items I1
Inner JOIN Items I2
On I1.itemId = I2.itemId
And I1.RowNum = I2.RowNum-1
Inner JOIN Items I3
On I2.itemId = I3.itemId
And I2.RowNum = I3.RowNum-1
Where 1=1
And I1.val = 1
And I2.val = 10
And I3.val = 1
WITH Items (itemId, date, val) AS (
SELECT 1, CONVERT(datetime, '5/1/2011'), 6 UNION ALL
SELECT 2, CONVERT(datetime, '5/1/2011'), 5 UNION ALL
SELECT 3, CONVERT(datetime, '5/1/2011'), 1 UNION ALL
SELECT 1, CONVERT(datetime, '6/1/2011'), 1 UNION ALL
SELECT 2, CONVERT(datetime, '6/1/2011'), 10 UNION ALL
SELECT 3, CONVERT(datetime, '6/1/2011'), 10 UNION ALL
SELECT 1, CONVERT(datetime, '7/1/2011'), 1 UNION ALL
SELECT 2, CONVERT(datetime, '7/1/2011'), 1 UNION ALL
SELECT 3, CONVERT(datetime, '7/1/2011'), 1
),
cte as
(
select *, row_number() over(partition by itemId order by date) [rn]
from Items t
)
select distinct a.itemId
from cte a
join cte b on b.rn = a.rn + 1 and b.itemId = a.itemId
join cte c on c.rn = b.rn + 1 and c.itemId = a.itemId
where a.val = 1 and b.val = 10 and c.val = 1