Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Posting on Qlik Community is temporarily paused. Thank you for patience and we'll update you soon!
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Load only first or last 5

Hi all,

In my load script, I have the following code:

IntervalProductX:

Load Customer, DeliveryDate

,if(peek(Customer)=Customer,-peek(DeliveryDate)+DeliveryDate) as Interval

resident CustomersDB

where Artikelidentification = 'PRODUCT X'

order by Customer, DeliveryDate;

This creates an Interval of the DeliveryDate per customer who gets Product X delivered.

(If necessary I can add asc / desc behind the order by, so it could be first or last 5)

Now I would like to show in a straight table, the average Interval per Customer over the last 5 DeliveryDate (1-5).

And in a second column with the avarage over DeliveryDate 6-15.

How can I calculate this in an expression or in the load script?

If I use the above code with "First 5" before it and order it by desc, it doesn't load the first 5 from each customer.

the straight table should look like

CustomerAvg Interval
Customer X6
Customer Y9

(don't need the dates, just the avarage of those last 5 Intervals)

I hope my question is clear.

Could someone help me with this?

Thanks in advance

Willem

Labels (1)
6 Replies
Not applicable
Author

I suggest you use the Class() function in a calculated dimension. It should be something like:

     Class(Interval, 5, 'DeliveryDate')

Even you can make the interval range dynamic, if you use a variable instead of a fixed 5.

Juan Gerardo

Not applicable
Author

Thanks for your reply Juan Gerardo Cabeza.

I don't see how I could implement this in my scenario.

I'm creating a straight table with the following fields:

"Customer", "MaxDeliveryDate", "Avg Interval over last 5 delivery dates" and a few more fields.

there are about 120 customers in this table.

I would like to see if their average interval over the last 5 delivery dates, change in comparison of the avg interval over the 10 delivery dates before them.

If I use the expression avg(Interval), the average interval over all the delivery dates is taken, but some order for more then 3 years.

I don't yet see how this class code could help me with this.

Since I can calculate per customer what their 5th last delivery date was, I was thinking about an expression like this:

=if((DeliveryDate)>FirstSortedValue(DeliveryDate, -DeliveryDate,5),avg(Interval))

But this comes up with nothing.

Plus that if it's a new customer who only has 3 DeliveryDates yet, the firstsortedvalue returns "-" (it doesn't exists yet)

Hopefully I made myself more clear, or maybe your way is the right way, but you could explain it a little more to me.

Thanks in advance.

Not applicable
Author

You have to use the Class() function as a Calculated Dimension, not expression. Maybe if you can attach some example qlikview I can have a look, and show you how to do it.

Not applicable
Author

That is was a calculated dimension, I am aware of.

I almost got it working I think.

The only thing is, is it possible to add a calculated value behind the FirstSortedValue (the ?

I got a piece of code which calculates if the number "5" is there. If so, the number 5 is filled in, if there are only for example 3 DeliveryDates, it fills in 3. But I can't get that piece of code implemented in this FirstSortedValue

So the following piece should be editted:

FirstSortedValue(DeliveryDate, -DeliveryDate,5)

to for example

FirstSortedValue(DeliveryDate, -DeliveryDate,

if(count({<[Artikelidentification]={'Product X'}>} DeliveryDate)>5,5,count({<[Artikelidentification]={'Product X'}>} DeliveryDate))

If I get this to work, I can calculate the average interval over the last 5 dates.

So how can I replace the in the FirstSortedValue with a calculation?

Not applicable
Author

Try using dollar expansion. Maybe:

FirstSortedValue(DeliveryDate, -DeliveryDate,

$(=if(count({<[Artikelidentification]={'Product X'}>} DeliveryDate)>5,5,count({<[Artikelidentification]={'Product X'}>} DeliveryDate)))

Not applicable
Author

That indeed helps Juan Gerardo.

But if I do this, it suddenly count all DeliveryDates, instead of those belonging to each Customer? (all return value 5)

So how should I change this piece of code then?

$(=if(count({<[Artikelidentification]={'Product X'}>} DeliveryDate)>5,5,count({<[Artikelidentification]={'Product X'}>} DeliveryDate)))

Thanks in advance