2009-06-20 19 views
6

Tôi có một số dữ liệu như thế này nhưng hơn 1500000 hồ sơ và hơn 700 người sử dụng:Chọn phân biệt với usercolumn và giá trị nhỏ nhất của ngày cho từng lĩnh vực trong usercolumn

usercolumn ,  datecolumn\  
a1   ,  1998/2/11\ 
a2   ,  1998/3/11\ 
a1   ,  1998/2/15\ 
a4   ,  1998/4/14\ 
a3   ,  1999/1/15\ 
a2   ,  1998/11/12\ 
a2   ,  1999/2/11\ 
a3   ,  2000/2/9\ 
a1   ,  1998/6/5\ 
a3   ,  1998/7/7\ 
a1   ,  1998/3/11\ 
a5   ,  1998/3/18\ 
a2   ,  1998/2/8\ 
a1   ,  1998/12/11\ 
a4   ,  1998/12/1\ 
a5   ,  1998/2/11\ 
.... 

Tôi muốn có dữ liệu riêng biệt từ usercolumn và giá trị nhỏ nhất của ngày cho mỗi người dùng như thế này:

usercolumn  , datecolumn \   
a1    , 1998/2/11\ 
a2    , 1998/2/8\ 
a3    , 1998/7/7\ 
a4    , 1998/4/14\ 
a5    , 1998/2/11\ 
.... 

hãy giúp tôi viết một lệnh SQL để làm điều này cho adapter OLEDB trong C#, cảm ơn.

+0

Câu trả lời của @ dmitri (một lần cố định theo nhận xét của tôi) là tốt cho vấn đề bạn nêu, nhưng tôi nghi ngờ bạn đã nêu sai vấn đề: cụ thể, nếu bạn có các cột khác, bạn cần Cách tiếp cận khác. –

Trả lời

0

Something như thế này nên làm như đánh dấu

SELECT usercolumn 
     , MIN(datecolumn) 
     FROM YouTable 
    GROUP BY usercolumn 
     , MIN(datecolumn) 
+0

"Lỗi SQL: các hàm tổng hợp không được phép trong mệnh đề GROUP BY" (ít nhất là từ các công cụ SQL phong nha! -). Chỉ cần loại bỏ dòng cuối cùng, nhóm theo phút (datecolumn) làm cho không có ý nghĩa và câu trả lời là tốt mà không có nó anyway! -) –

+0

Xin lỗi. Chỉ cần mistypes.Thanks cho sửa chữa. –

0

Nếu bạn có nhiều hơn chỉ là hai cột, SQL tốt nhất để sử dụng phụ thuộc một chút về những gì máy chủ bạn có ở đầu kia của rằng bộ chuyển đổi OLEDB, nhưng đây là cái gì đó sẽ làm việc tốt với nhiều (than ôi, không phải tất cả!) các máy chủ có thể ví dụ:

SELECT t.* 
FROM thetable t 
LEFT JOIN thetable taux 
    ON(t.usercolumn=taux.usercolumn 
    AND t.datecolumn>taux.datecolumn) 
WHERE taux.usecolumn IS NULL 

mà bạn có thể đọc là "phát ra những dãy thetable như vậy là không có hàng khác của bảng với cùng một người dùng và một ngày hoàn toàn ít hơn ". Nếu ngày tối thiểu cho một người dùng nhất định có thể xảy ra nhiều lần, điều này sẽ cung cấp nhiều hàng cho người dùng đó - nếu đó là vấn đề với bạn, cũng có giải pháp cho nó ... nhưng tôi sẽ đợi bạn làm rõ câu hỏi của bạn hơn trước khi tôi làm việc nữa về vấn đề này -)

2

này sẽ làm việc cho SQLServer 2008 và DB2:

with temp as (
    select *, row_number() over (partition by usercolumn order by datecolumn) as rownum 
    from table) 
select * from temp 
where rownum = 1 

Nó sẽ cho kết quả phù hợp ngay cả khi bạn cần phải bao gồm nhiều cột trong các lựa chọn.

20
SELECT usercolumn, MIN(datecolumn) FROM tablename GROUP BY usercolumn; 

Lưu ý rằng nếu bạn muốn các cột khác, chúng phải xuất hiện trong mệnh đề GROUP BY hoặc không đổi trên các hàng. Nếu không, kết quả sẽ không xác định.

+0

+1 Câu trả lời đơn giản và chính xác – gbn

+0

phù hợp với tôi, thx – 5er

+0

cuối cùng, sau khi tìm kiếm hàng giờ. cảm ơn –

0

bạn có thể thử này:

SELECT DISTINCT a.username, a.date 
FROM tablename AS a INNER JOIN tablename AS b 
ON(a.username = b.username AND a.date < b.date) 

Đối với C#, giúp đỡ không thể bạn có

0

CHỌN USERNAME DISTINCT, DATE TỪ TABLENAME NHƯ MỘT ĐÂU A.DATE = (SELECT MIN (NGÀY) TỪ TABLENAME WHERE USERNAME = A.USERNAME)

Các vấn đề liên quan