OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

office-comment message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: [office-comment] DISTINCT Values


Hi,

Patrick Durusau wrote:
> Leonard,
>
> Another interesting comment!
>
> Hmmm, but isn't it true that what OpenDocument should define are the 
> operators that work with DISTINCT (and other functions) such that you 
> can write your own functions?
>
> What concerns me is that no matter how large the eventual list, we are 
> going to miss that special function that someone has to have. If we 
> give them the ability to use standard operators with which to write 
> their specialized functions, that lessens the load on us and gives 
> users greater freedom.

Unfortunately, I have a very different and justified opinion. Maybe I 
have some better understanding of spreadsheet use than many people on 
this list as I have both
    extensively used  spreadsheets myself for working
    overlooked 100+ employees working extensively with spreadsheets
    extensively used  spreadsheets in research settings

I experienced frequent ERRORS and COMMON use cases.

One of the most  frequent uses for spreadsheets could be described as 
follows:

We have various items (wich can be repeated) and for each item we have 
some characteristics. e.g.
 a sales items - a location/supermarket - number of sales
 a different sales item - some other location - number of sales
 the same item - ...
 ...

1.) So, we may want to know how many items were sold in every location, 
what were the global revenues per item, ... . Indeed, spreadsheets are 
still frequently used in such settings.

2.) A different example:
We may collect the drug prescriptions over 12 month:
patient ID - drug prescribed - amount - unit price - doctor prescribing
Of course, any patient may take more than one type of drug and even the 
same drug can be bought 2 or more times. So, me may want to analyse:
 - what are the costs per patient: aka  SUM(for every group of 
DISTINCT(patient_ID); unit_price * amount)
 - how many prescriptions were for each drug, aka:
   COUNT( for every group of DISTINCT(drug_prescribed); amount)
 - cost per drug: which are the most expensive drugs?
    SUM( for every group of DISTINCT(drug_prescribed); unit_price * amount)
 - which doctors prescribe most of the drugs; ...

3.) A research example
age - various physiologic parameters - disease - outcome
 - effect of age on various parameters
   stratify on AGE and compute the desired parameters in these age 
groups, e.g.
    <10 yr, 10-19, 20-30, 30-40, ... => quite time consuming IF not done 
automatically
 (see the DISTINCT( 'cell_range', AS.TEXT = FALSE, 'cell_range2') 
example in my first post)

Indeed, many of these analysis could be done using databases, but much 
of this work is still done in spreadsheets. Spreadsheets have the 
advantage that the structure is quite loose, allowing greater 
flexibility. Also, one has greater overview over the data, and can 
better decide what analysis is warranted.

Indeed. much of my recent work involves such auditing. DISTINCT() per se 
was NOT the primary reason I need it. It is this extension:
 1.) to group data based on some parameter
 2.) compute various other values for every such group
(Although I occasionally need to know the number of factors as well.)

One can view this as various *vector operations*, where one of the 
parameters (or even more parameters) act as *categorizing factors*, 
splitting the population into various groups of data (similarly to the R 
as.factor() / http://cran.R-project.org). One wishes to analyse 
individually these groups, BUT as there may be 1000+ groups, sorting and 
doing ALL these operations individually is really NOT possible. Trust 
me, I work with datasets of 100,000+ records (even substantially more). 
And this is quite a common task (and will remain so in the foreseeable 
future). When using more than one factor, spreadsheets break completely.

There are various custom solutions, BUT shouldn't the spreadsheet 
conquer this field back? I haven't seen any major benefit of custom 
solutions. They are way to inflexible, and much too expensive.

Sincerely,

Leonard Mada

> Hope you are having a great day!
>
> Patrick
>
> Leonard Mada wrote:
>
>> I strongly miss a function to return the number of DISTINCT values 
>> existent in a given cell range. To my knowledge, this functionality 
>> is missing in every spreadsheet application, although most of the 
>> research involves such analysis.
>>
>> I would be further interested  to perform some operations using these 
>> distinct values.
>>
>> Functions:
>> DISTINCT( 'cell_range', AS.TEXT = TRUE, IGNORE.CASE = TRUE)
>> returns number of distinct strings in the cell range
>>
>>
>> DISTINCT( 'cell_range', AS.TEXT = FALSE, TOLERANCE = 0)
>> returns number of different values
>> DISTINCT( 'cell_range', AS.TEXT = FALSE, TOLERANCE = 0.5, ORDER = 
>> "ASCENDING")
>> returns number of different values; values within TOLERANCE are 
>> considered EQUAL
>>  - values are ranked first using the specified ORDER
>>  - IF( x[i] is within TOLERANCE of x[i-1]), the 2 values are 
>> considered equal
>> DISTINCT( 'cell_range', AS.TEXT = FALSE, TOLERANCE = '5%', ORDER = 
>> "ASCENDING")
>> returns number of different values; values within TOLERANCE are 
>> considered EQUAL
>>  - values are ranked first using the specified ORDER
>>  - IF( x[i] is within TOLERANCE of x[i-1]), the 2 values are 
>> considered equal
>>  - the absolute value for TOLERANCE is computed as x[i-1] * TOLERANCE
>>
>>
>> DISTINCT( 'cell_range', AS.TEXT = FALSE, 'cell_range2')
>> returns number of different values within 'cell_range'
>>  - 'cell_range2' describes the bounds/intervals used for splitting 
>> the initial data (i.e. for splitting 'cell_range')
>>  - the values within 'cell_range2' are ranked
>>  - IF any value from 'cell_range' < MIN('cell_range2') => this is 
>> first group
>>  - any value from 'cell_range' is within
>>        RANKED(cell_range2)[1]
>>        RANKED(cell_range2)[2] => next group
>>  - ...
>>  - any value from 'cell_range' > MAX('cell_range2') => this is the 
>> last group
>>
>> Of course, DISTINCT() is just one aspect of the analysis. Actually, I 
>> am more interested in doing specific calculations based on these 
>> distinct groups (like SUM(), COUNT(), ...). I will describe such 
>> calculations in a later post.
>>
>> Sincerely,
>>
>> Leonard Mada



[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]