选择用户列中的不同字段,并为每个字段选择最小日期值。

10

我有一些像这样的数据,但记录数超过1500000条,用户数超过700个:

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\
....

我想要从usercolumn中获取不同的数据,并且对于每个用户获取最小日期值,如下所示:

usercolumn      ,    datecolumn \        
a1              ,    1998/2/11\
a2              ,    1998/2/8\
a3              ,    1998/7/7\
a4              ,    1998/4/14\
a5              ,    1998/2/11\
....
请帮我编写一条 SQL 命令,以便在 C# 中使用 oledb 适配器执行此操作,谢谢。

@dmitri的答案(根据我的评论进行修正后)对于您所述的问题是可以的,但我怀疑您可能错误地陈述了问题:具体而言,如果您有其他列,则需要另一种方法。 - Alex Martelli
6个回答

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

请注意,如果您想要其他列,它们必须出现在 GROUP BY 子句中或在所有行中保持不变。否则,结果将是不确定的。


2

这适用于SQLServer 2008和DB2:

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

即使您需要在选择中包含多个列,它也会给出正确的结果。

0

类似这样的代码应该可以解决问题

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

2
SQL错误:在GROUP BY子句中不允许使用聚合函数(至少从像样的SQL引擎!-)。只需删除最后一行即可,按min(datecolumn)分组没有意义,无论如何答案都可以。-) - Alex Martelli

0

如果你有超过这两列的数据,最好使用的SQL语句取决于你在OleDB适配器的另一端使用的服务器类型,但是下面的代码可以在许多(但不是所有)这样的服务器上很好地工作:

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

你可以将其理解为“发出那些表中的行,使得没有其他行具有相同的用户和严格较早的日期”。如果给定用户的最小日期可以多次出现,则会为该用户提供许多行-如果这对您是个问题,也有解决方案...但在我进一步处理之前,我会等待您更明确地阐述问题!-)


0
你可以尝试这个:
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)

关于C#,我无能为力


0

SELECT DISTINCT USERNAME, DATE FROM TABLENAME AS A WHERE A.DATE=(SELECT MIN(DATE) FROM TABLENAME WHERE USERNAME=A.USERNAME)

从TABLENAME中选择不同的USERNAME和DATE,作为A表,其中A.DATE等于在TABLENAME中选择最小DATE时,USERNAME等于A.USERNAME的记录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接