/ / T-SQL iteratívne kontroluje históriu - tsql, iteráciu

T-SQL iteračne skontrolovať vzor histórie - tsql, iterácia

Ako urobíte výber na základe predchádzajúcej histórie položky?

Napríklad sa pokúšam vybrať položku, ktorámá hodnotu val 1, predtým mal hodnotu val 10 a predtým mal hodnotu val 1. Jedinou položkou, ktorá by mala spĺňať nasledujúce údaje, by bola položkaId = 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

odpovede:

0 pre odpoveď č. 1

Keďže máte Hodnota v predchádzajúci dátum požiadavka, musíte použiť ROW_NUM Zoradenie podľa ItemId a Dátum.

Potom urobíte dve sa pripojí na ID plus sa RowNum pripája k pred ním (v skutočnosti k predchádzajúcemu dátumu) a pridá WHERE vety k 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

0 pre odpoveď č. 2

Takto dostanete konkrétnu odpoveď. Nie ste si istí, aké užitočné to je v abstraktnom zmysle. Stále hľadáte položky, ktoré majú presne 3 hodnoty, 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

0 pre odpoveď č. 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
),
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