Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add argument to get_column_values allow for alternate sorting of column values #289

Closed
wants to merge 7 commits into from
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Make order_by work for column alpha sorts
  • Loading branch information
clausherther committed Dec 24, 2020
commit d9b06fc997df3742e3df4cde68ee297897872008
18 changes: 15 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -442,7 +442,7 @@ group by 1
This macro returns the unique values for a column in a given [relation](https://docs.getdbt.com/docs/writing-code-in-dbt/class-reference/#relation).
It takes an options `default` argument for compiling when the relation does not already exist.

The `sort_column` argument allows for sorting of values. The default is highest to lowest frequency of values. You can also specify a `sort_direction`.
The `order_by` argument allows for sorting of values. The default is highest to lowest frequency of values. You can also specify a `sort_direction`.

Usage:
```
@@ -458,7 +458,7 @@ Usage:

```
-- Returns a list of user names sorted by name from the `users` table
{% set names = dbt_utils.get_column_values(table=ref('users'), column='name', sort_column='name', default=[]) %}
{% set names = dbt_utils.get_column_values(table=ref('users'), column='name', default=[], order_by='name') %}

{% for name in names %}
...
@@ -469,7 +469,19 @@ Usage:

```
-- Returns a list of user cities sorted by name from the `users` table
{% set cities = dbt_utils.get_column_values(table=ref('users'), column='city_name', sort_column='city_name', default=[]) %}
{% set cities = dbt_utils.get_column_values(table=ref('users'), column='city_name', default=[], order_by='city_name') %}

{% for city in cities %}
...
{% endfor %}

...
```


```
-- Returns a list of user cities sorted by name from the `users` table
{% set cities = dbt_utils.get_column_values(table=ref('users'), column='city_name', default=[], order_by='max(created_at)') %}

{% for city in cities %}
...
2 changes: 1 addition & 1 deletion integration_tests/models/sql/test_get_column_values.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

{% set columns = dbt_utils.get_column_values(ref('data_get_column_values'), 'field', default = []) %}
{% set columns = dbt_utils.get_column_values(ref('data_get_column_values'), 'field', default = [], order_by="field", sort_direction="desc") %}


{% if target.type == 'snowflake' %}
12 changes: 10 additions & 2 deletions macros/sql/get_column_values.sql
Original file line number Diff line number Diff line change
@@ -18,7 +18,15 @@ Returns:
{% endif %}
{#-- #}

{%- set order_by = kwargs.get('order_by', 'count(*)') -%}
{%- set order_by = order_by if order_by else 'count(*)' -%}
{%- set order_by = 'max(' ~ order_by ~ ')' if order_by == column else order_by -%}
{%- set sort_direction -%}
{%- if order_by == column -%}
{{ sort_direction or 'asc' }}
{%- else -%}
{{ sort_direction or 'desc' }}
{%- endif -%}
{%- endset -%}

{%- set target_relation = adapter.get_relation(database=table.database,
schema=table.schema,
@@ -46,7 +54,7 @@ Returns:
{{ order_by }} as sort_column
from {{ target_relation }}
group by 1
order by {{ order_by }} {{ sort_direction or "desc" }}
order by {{ order_by }} {{ sort_direction }}
{% if max_records is not none %}

limit {{ max_records }}