Ask a Question
Ask Question Login
Corporate Training
  1. Community
  2. SQL Server
  3. Question
SQL Server

How to select distinct on one column & any in another column?

Asked by Gillian Hamer Oct 3, 2022 4.7K views 2 answers
Share

About this question

 I need to query an SQL database to find all distinct values of one column and I need an arbitrary value from another column. For example, consider the following table with two columns, key and value:

key     value

===     =====

one     test

one     another

one     value

two     goes

two     here

two     also

three   example

I wish to get back one sample row, chosen arbitrarily, from each distinct key, perhaps getting these three rows:

key     value

===     =====

one     test

two     goes

three   example

How can I formulate such a query in SQL?


Your answer

2 Answers

Ranjana Admin JanBask Expert Latest answer

Answered on May 20, 2024

To select distinct values based on one column while allowing any value in another column in SQL, you can use the DISTINCT ON clause (specific to PostgreSQL) or use a GROUP BY with window functions for more flexibility across different SQL databases.

Here are approaches for PostgreSQL and for databases that support standard SQL:

PostgreSQL: Using DISTINCT ON

PostgreSQL has a convenient DISTINCT ON clause which makes this task straightforward.

  SELECT DISTINCT ON (column1) column1, column2

FROM your_table

ORDER BY column1, some_other_column;

column1 is the column you want distinct values for.

column2 can be any value associated with the distinct column1.

some_other_column is used to determine which row to choose for column2 when there are multiple rows with the same column1.

Example:

Suppose you have a table employees with columns department and employee_name, and you want distinct departments with any employee name.

SELECT DISTINCT ON (department) department, employee_name

FROM employees

ORDER BY department, employee_name;

Standard SQL: Using GROUP BY with Window Functions

If you're using a database that doesn't support DISTINCT ON, you can achieve similar results using window functions.

WITH ranked AS (
    SELECT column1, column2,
           ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY some_other_column) as rn
    FROM your_table
)

SELECT column1, column2

FROM ranked
WHERE rn = 1;

Example:

Using the same employees table:

WITH ranked AS (
    SELECT department, employee_name,
           ROW_NUMBER() OVER (PARTITION BY department ORDER BY employee_name) as rn
    FROM employees
)

SELECT department, employee_name

FROM ranked
WHERE rn = 1;

Explanation:

Window Function: ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY some_other_column) assigns a unique number to each row within each partition of column1 based on the order specified by some_other_column.

Common Table Expression (CTE): The CTE named ranked includes these row numbers.

Final Selection: The outer query selects rows where the row number is 1, ensuring that only the first occurrence of each column1 is selected.

By using these methods, you can effectively select distinct values from one column while allowing flexibility in another column across different SQL databases.







Was this helpful?

More SQL Server discussions

Learn & Explore

Free tutorials and interview questions from industry experts — learn the skill, then get ready to prove it.

Latest SQL Server Blogs

Guides, tips and career advice on SQL Server from JanBask experts.