Đây là dữ liệuChọn một hàng với giá trị riêng biệt của một cột
id name start_date end_date merchant_id
===================================================
111 name1 25-nov-11 31-jan-12 9999
222 name2 23-nov-11 25-dec-11 9999
333 name3 25-nov-11 25-nov-12 9999
444 name4 20-nov-11 20-nov-11 9999
555 name5 25-nov-11 25-dec-11 8888
666 name6 19-oct-11 20-nov-11 8888
777 name7 20-nov-11 20-jun-12 8888
tôi cần để có được tất cả các hàng sắp xếp theo start_date
(desc), nơi start_date<=today
và end_date >=today
nhưng giới hạn 1 mỗi merchant_id
. Điều đó có nghĩa là nếu truy vấn tìm thấy nhiều hàng, thì chỉ cần trả lại hàng đầu tiên.
thử nghiệm kịch bản
CREATE TABLE DEAL
(
ID VARCHAR2(40 BYTE) NOT NULL,
NAME VARCHAR2(255 BYTE),
START_DATE DATE,
END_DATE DATE,
MERCHANT_ID NUMBER(22),
CONSTRAINT DEAL PRIMARY KEY (ID)
);
INSERT ALL
INTO DEAL (ID,NAME,START_DATE,END_DATE,MERCHANT_ID) VALUES ('111','name1','25-nov-11','31-jan-12','9999')
INTO DEAL (ID,NAME,START_DATE,END_DATE,MERCHANT_ID) VALUES ('222','name2','23-nov-11','25-dec-11','9999')
INTO DEAL (ID,NAME,START_DATE,END_DATE,MERCHANT_ID) VALUES ('333','name3','25-nov-11','25-nov-12','9999')
INTO DEAL (ID,NAME,START_DATE,END_DATE,MERCHANT_ID) VALUES ('444','name4','20-nov-11','20-nov-11','9999')
INTO DEAL (ID,NAME,START_DATE,END_DATE,MERCHANT_ID) VALUES ('555','name5','25-nov-11','25-dec-11','8888')
INTO DEAL (ID,NAME,START_DATE,END_DATE,MERCHANT_ID) VALUES ('666','name6','19-oct-11','20-nov-11','8888')
INTO DEAL (ID,NAME,START_DATE,END_DATE,MERCHANT_ID) VALUES ('777','name7','20-nov-11','20-jun-12','8888')
SELECT * FROM dual;
chạy này:
SELECT DISTINCT merchant_id, id, name, start_date, end_date FROM deal WHERE start_date <= trunc(sysdate) AND end_date >= trunc(sysdate) ORDER BY start_date DESC;
không trả lại kết quả mong muốn như id thương tương tự được trả lại nhiều lần:
MERCHANT_ID ID NAME START_DATE END_DATE
===========================================
9999 111 name1 25-NOV-11 31-JAN-12
9999 333 name3 25-NOV-11 25-NOV-12
8888 555 name5 25-NOV-11 25-DEC-11
9999 222 name2 23-NOV-11 25-DEC-11
8888 777 name7 20-NOV-11 20-JUN-12
bạn có thể sử dụng GIỮA khoản thay vì start_date <= hôm nay và end_date> = ngày hôm nay. –
Tôi đã thử nhiều câu khác nhau, giới hạn, nhóm theo .. nhưng không thể làm được bất kỳ việc gì. Tôi có thể nhận được tất cả các hàng có ngày bắt đầu và ngày kết thúc phù hợp nhưng không biết cách trả lại 1 hàng cho mỗi merchant_id –
Bạn đang sử dụng cơ sở dữ liệu nào? nếu bạn đang sử dụng Oracle một giải pháp là sử dụng chức năng phân tích – Giovanni