2015-10-22 33 views
1

有没有办法让我使用查询或存储过程来做到这一点?有没有办法根据数据行选择行作为标准?

示例表:

ID   TYPE TIMESTAMP  QTY 
P12345.1 A  2015-10-22  90 
P12345.2 A  2015-10-22  0 
P12001.1 A  2015-10-22  87 
P12345.3 A  2015-10-23  92 
P19000.1 B  2015-10-23  75 

我想只选择行,只要它们具有在ID相同的前缀(字符之前周期()。),并且它们具有相同类型和相同的时间戳。

在上面的例子中,3行具有相同的前缀:P12345.1,P12345.2和P12345.3。但是,只有P12345.1和P12345.2具有相同的时间戳,因此我将选择P12345.1的行而不是P12345.2。

这应该是结果表:

ID   TYPE TIMESTAMP  QTY 
P12345.1 A  2015-10-22  90 
P12001.1 A  2015-10-22  87 
P12345.3 A  2015-10-23  92 
P19000.1 B  2015-10-23  75 

我真的有一个很难解决这一点,我需要这个使用查询或存储过程来完成。先谢谢你。非常感谢你的帮助。

+0

所以你的意思是,如果同样的Pnnnnn前缀和同一日期,挑最低后缀行? – jarlh

+1

您使用的是什么RDBMS? – brenners1302

+0

@jarlh相同的前缀,相同的日期和相同的类型,是的。挑选最低后缀的行。 – Peter

回答

1
select ID, TYPE, TIMESTAMP, QTY 
from tablename t1 
where not exists (select 1 from tablename t2 
        where LEFT(t2.id, 6) = LEFT(t1.id, 6) 
        and t2.TIMESTAMP= t1.TIMESTAMP 
        and t2.id < t1.id) 
1

试试这个,

SELECT ID 
     ,TYPE 
     ,TIMESTAMP 
     ,QTY 
FROM PrefixTable t1 
WHERE NOT EXISTS (
      SELECT 1 
      FROM PrefixTable t2 
      WHERE SUBSTRING(t2.id ,1 ,6) = SUBSTRING(t1.id ,1 ,6) 
        AND t2.TIMESTAMP = t1.TIMESTAMP 
        AND t2.id < t1.id 
     ) 
0

试试这个:

select dt.* 
    from dataTable dt 
where right(dt.id,1) = (select min(right(dt2.id,1)) from dataTable dt2 
          where left(dt.id,6) = left(dt2.id,6) 
          and dt.timestamp = dt2.timestamp) 
相关问题