I don't think your query is doing what he wants. Your query will correctly set the starting point, but will also return larger interval_id's but with lower skill_levels:
cqlsh:test> select * from skill_count where skill='Complaints' and (interval_id, skill_level) >= (1402359300000, 5); skill | interval_id | skill_level | skill_count ------------+---------------+-------------+------------- Complaints | 1402359300000 | 5 | 20 Complaints | 1402359300000 | 8 | 30 Complaints | 1402359300000 | 10 | 1 Complaints | 1402359400000 | 2 | 10 Complaints | 1402359400000 | 8 | 30 (5 rows) cqlsh:test> select * from skill_count where skill='Complaints' and (interval_id, skill_level) >= (1402359300000, 5) and (interval_id) < (1402359900000); skill | interval_id | skill_level | skill_count ------------+---------------+-------------+------------- Complaints | 1402359300000 | 5 | 20 <- desired Complaints | 1402359300000 | 8 | 30 <- desired Complaints | 1402359300000 | 10 | 1 <- desired Complaints | 1402359400000 | 2 | 10 <- SKIP Complaints | 1402359400000 | 8 | 30 <- desired The query results in a discontinuous range slice so isn't supported -- Essentially, the client will have to read the entire range and perform client-side filtering. Whether this is efficient depends on the cardinality of skill_level. I tried playing with the "allow filtering" cql clause, but it would appear from the documentation it's very restrictive... On Mon, Jul 14, 2014 at 7:44 AM, DuyHai Doan <doanduy...@gmail.com> wrote: > or : > > > select * from skill_count where skill='Complaints' > and (interval_id,skill_level) >= (1402359300000,5) > and (interval_id) < (1402359900000) > > Strange enough, when starting using tuple notation you'll need to stick to > it even if there is only one element in the tuple > > > On Mon, Jul 14, 2014 at 1:40 PM, DuyHai Doan <doanduy...@gmail.com> wrote: > >> Sorry, I've just checked, the correct query should be: >> >> select * from skill_count where skill='Complaints' and >> (interval_id,skill_level) >= (1402359300000,5) and >> (interval_id,skill_level) < (1402359900000,11) >> >> >> On Mon, Jul 14, 2014 at 9:45 AM, DuyHai Doan <doanduy...@gmail.com> >> wrote: >> >>> Hello Mathew >>> >>> Since Cassandra 2.0.6 it is possible to query over composites: >>> https://issues.apache.org/jira/browse/CASSANDRA-4851 >>> >>> For your example: >>> >>> select * from skill_count where skill='Complaints' and >>> (interval_id,skill_level) >= (1402359300000,5) and interval_id < >>> 1402359900000; >>> >>> >>> On Mon, Jul 14, 2014 at 6:09 AM, Matthew Allen < >>> matthew.j.al...@gmail.com> wrote: >>> >>>> Hi, >>>> >>>> We have a roll-up table that as follows. >>>> >>>> CREATE TABLE SKILL_COUNT ( >>>> skill text, >>>> interval_id bigint, >>>> skill_level int, >>>> skill_count int, >>>> PRIMARY KEY (skill, interval_id, skill_level)); >>>> >>>> Essentially, >>>> skill = a names skill i.e. "Complaints" >>>> interval_id = a rounded epoch time (15 minute intervals) >>>> skill_level = a number/rating from 1-10 >>>> skill_count = the number of people with the specified skill, with the >>>> specified skill level, logged in at the interval_id >>>> >>>> We'd like to run the following query against it >>>> >>>> select * from skill_count where skill='Complaints' and interval_id >= >>>> 1402359300000 and interval_id < 1402359900000 and skill_level >= 5; >>>> >>>> to get a count of people with the relevant skill and level at the >>>> appropriate time. However I am getting the following message. >>>> >>>> Bad Request: PRIMARY KEY part skill_level cannot be restricted >>>> (preceding part interval_id is either not restricted or by a non-EQ >>>> relation) >>>> >>>> Looking at how the data is stored ... >>>> >>>> ------------------- >>>> RowKey: Complaints >>>> => (name=1402359300000:2:, value=, timestamp=1405308260403000) >>>> => (name=1402359300000:2:skill_count, value=0000000a, >>>> timestamp=1405308260403000) >>>> => (name=1402359300000:5:, value=, timestamp=1405308260403001) >>>> => (name=1402359300000:5:skill_count, value=00000014, >>>> timestamp=1405308260403001) >>>> => (name=1402359300000:8:, value=, timestamp=1405308260419000) >>>> => (name=1402359300000:8:skill_count, value=0000001e, >>>> timestamp=1405308260419000) >>>> => (name=1402359300000:10:, value=, timestamp=1405308260419001) >>>> => (name=1402359300000:10:skill_count, value=00000001, >>>> timestamp=1405308260419001) >>>> >>>> Should cassandra be able to allow for an extra level of filtering ? or >>>> is this something that should be performed from within the application. >>>> >>>> We have a solution working in Oracle, but would like to store this data >>>> in Cassandra, as all the other data that this solution relies on already >>>> sits within Cassandra. >>>> >>>> Appreciate any guidance on this matter. >>>> >>>> Matt >>>> >>> >>> >> > -- *Ken Hancock *| System Architect, Advanced Advertising SeaChange International 50 Nagog Park Acton, Massachusetts 01720 ken.hanc...@schange.com | www.schange.com | NASDAQ:SEAC <http://www.schange.com/en-US/Company/InvestorRelations.aspx> Office: +1 (978) 889-3329 | [image: Google Talk:] ken.hanc...@schange.com | [image: Skype:]hancockks | [image: Yahoo IM:]hancockks [image: LinkedIn] <http://www.linkedin.com/in/kenhancock> [image: SeaChange International] <http://www.schange.com/>This e-mail and any attachments may contain information which is SeaChange International confidential. The information enclosed is intended only for the addressees herein and may not be copied or forwarded without permission from SeaChange International.