Как выбрать строки на основе уникального столбца - PullRequest
0 голосов
/ 21 июля 2010

У меня есть таблица со значениями как

    ColumnA   ColumnB

    ASD       A
    CSD       B
    DSD       C
    ESD       D
    FSD       D
    GSD       D

Столбец A является первичным ключом, мне нужен результат как

    ColumnA   ColumnB

    ASD       A
    CSD       B
    DSD       C
    ESD       D

Я хочу все уникальные значения из столбца B и связанные с ними первые значенияcolumnA.

Я попробовал несколько запросов и посмотрел в Google, но не смог найти решение для муравья.

Спасибо, Рохит.

Ответы [ 7 ]

3 голосов
/ 21 июля 2010

First is First в ключевом порядке (то есть в алфавитном порядке).

SELECT MIN(ColumnA) AS ColumnA, ColumnB
FROM tbl
GROUP BY ColumnB

Вы пометили MySQL и Oracle по какой-то причине.Вышеуказанное будет работать в обоих случаях.

Oracle также имеет аналитические функции, которые могут помочь с этим общим типом запроса.

2 голосов
/ 21 июля 2010

С аналитикой (Oracle):

SQL> WITH tab AS (
  2     SELECT 'ASD' columnA, 'A' columnB FROM DUAL
  3     UNION ALL SELECT 'CSD', 'B' FROM DUAL
  4     UNION ALL SELECT 'DSD', 'C' FROM DUAL
  5     UNION ALL SELECT 'ESD', 'D' FROM DUAL
  6     UNION ALL SELECT 'FSD', 'D' FROM DUAL
  7     UNION ALL SELECT 'GSD', 'D' FROM DUAL
  8  )
  9  SELECT columnA, columnB
 10    FROM (SELECT columnA, columnB,
 11                 rank() over(PARTITION BY columnB ORDER BY columnA) rnk
 12            FROM tab)
 13   WHERE rnk = 1;

COLUMNA COLUMNB
------- -------
ASD     A
CSD     B
DSD     C
ESD     D
2 голосов
/ 21 июля 2010
select min(columna) columna, columnb
from mytable
group by columnb;
0 голосов
/ 02 февраля 2011

Вот решение

CREATE TABLE tbl_test ( col1 varchar (5) collate latin1_general_ci NOT NULL, col2 varchar (5) collate latin1_general_ci NOT NULL, ПЕРВИЧНЫЙ КЛЮЧ (col1) ) ENGINE = MySAM CHARSET ПО УМОЛЧАНИЮ = latin1 COLLATE = latin1_general_ci;

INSERT INTO tbl_test VALUES ('ASD', 'A'); INSERT INTO tbl_test VALUES ('CSD', 'B'); INSERT INTO tbl_test VALUES ('DSD', 'C'); INSERT INTO tbl_test VALUES («ESD», «D»); INSERT INTO tbl_test VALUES ('FSD', 'D'); INSERT INTO tbl_test VALUES ('GSD', 'D');


ВЫБЕРИТЕ DISTINCT ( col2 ), col1 ОТ tbl_test GROUP BY col2 LIMIT 0, 30;

0 голосов
/ 22 июля 2010

Просто еще один способ сделать то же самое:

SELECT DISTINCT
    FIRST_VALUE(ColumnA)
    OVER (PARTITION BY ColumnB
          ORDER BY ColumnA) AS ColumnA,
    ColumnB
FROM tbl

Это имеет преимущество в том, что его можно использовать с несколькими столбцами (т. Е. Там, где метод GROUP BY не работает).

0 голосов
/ 21 июля 2010
CREATE TABLE #t_Val
(
    ColumnA VARCHAR(3) PRIMARY KEY
,   ColumnB CHAR(1) NOT NULL
)

INSERT #t_Val
SELECT 'ASD' ,  'A'
UNION
SELECT 'CSD' ,  'B'
UNION
SELECT 'DSD' ,  'C'
UNION
SELECT 'ESD' ,  'D'
UNION
SELECT 'FSD' ,  'D'
UNION
SELECT 'GSD' ,  'D'


SELECT  MIN(ColumnA),ColumnB
FROM #t_Val
GROUP BY ColumnB
0 голосов
/ 21 июля 2010
select min(ColumnA) as ColumnA,ColumnB from table
group by ColumnB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...