我有以下
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
答案 0 :(得分:3)
首先,我非常感谢您提供DDL和DML的手势。
您可以使用KEEP .. DENSE_RANK .. FIRST
查询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
)
;
它将解决你的目的......