从表中获取第一个唯一记录

时间:2018-03-12 05:04:04

标签: sql oracle oracle11g

我有以下

CREATE TABLE TABLEA (
fieldA VARCHAR(2) ,
fieldB  VARCHAR(2),
fieldC VARCHAR(2),
fieldD VARCHAR(2),
DATE_PROD VARCHAR(8),
DATE_LOAD VARCHAR(8)
)
;

-- data
INSERT INTO TABLEA
(fieldA, fieldB, fieldC, fieldD, DATE_PROD, DATE_LOAD)
VALUES
('1', '2', '3', '4', '10102015', '10112015'),
('1', '2', '3', '4', '11102015', '11102015'),
('1', '2', '3', '4', '11102015', '12102015'),
('2', '4', '3', '4', '11102015', '11102015')
;

我想要一个查询,它只会获得具有最小DATE_PROD值的唯一fieldA到fieldD以及它对应的DATE_LOAD值

fieldA fieldB fieldC fieldD DATE_PROD DATE_LOAD
------ ------ ------ ------ --------- --------
1      2       3     4     10102015    10112015
2      4       3     4     11102015    11102015

3 个答案:

答案 0 :(得分:3)

首先,我非常感谢您提供DDL和DML的手势。

您可以使用KEEP .. DENSE_RANK .. FIRST

SQL Fiddle

查询1

SELECT fieldA
    ,fieldB
    ,fieldC
    ,fieldD
    ,MIN(DATE_PROD) DATE_PROD
    ,MIN(DATE_LOAD) KEEP (
        DENSE_RANK FIRST ORDER BY DATE_PROD
        ) DATE_LOAD
FROM TABLEA
GROUP BY fieldA
    ,fieldB
    ,fieldC
    ,fieldD

<强> Results

| FIELDA | FIELDB | FIELDC | FIELDD | DATE_PROD | DATE_LOAD |
|--------|--------|--------|--------|-----------|-----------|
|      1 |      2 |      3 |      4 |  10102015 |  10112015 |
|      2 |      4 |      3 |      4 |  11102015 |  11102015 |

答案 1 :(得分:1)

使用ROW_NUMBER

SELECT
    fieldA, fieldB, fieldC, fieldD, DATE_PROD, DATE_LOAD
FROM
(
    SELECT t.*,
        ROW_NUMBER() OVER (PARTITION BY fieldA, fieldB, fieldC, fieldD
            ORDER BY DATE_PROD) rn
    FROM yourTable t
) a
WHERE rn = 1

我假设最早的生产日期没有关系,或者,如果有,你不关心返回哪一条记录。如果你想包括关系,那么我们可以使用排名函数而不是行号。

另外,请考虑使用日期类型而不是文本来存储日期信息。

答案 2 :(得分:0)

Select * from tablea o
where exists(
            Select 1 from (
                            Select fielda, min(date_prod) as date_prod
                            from tablea
                            group by fielda
                          ) i
            Where i.fielda = o.fielda
            and i.date_prod = o.date_prod
            )
;

它将解决你的目的......