当存在多个实例时,如何仅返回列值的1(特定)实例

时间:2014-01-23 16:31:26

标签: mysql sql distinct partitioning

我有以下名为'timtest'的示例表:

itemcode     qty_available  date
apple        0              1/23/2014
apple        96             1/27/2014
apple        136            2/15/2014
orange       12             1/23/2014
orange       48             2/5/2014
peach        0              1/23/2014
peach        300            2/5/2014
peach        315            2/10/2014
peach        330            2/15/2014
banana       0              1/23/2014
pineapple    24             1/23/2014

我只想在itemcode列中只显示每个唯一值的一个实例。选择为每个唯一商品代码选择哪一行的标准是基于数量大于零而最快的日期任何大于零的数量都​​可用。如果今天有一个大于零的数量,我想退回那一行。如果今天的日期可用的数量是0,我想在最近的将来找到下一个可用数量大于零的可用记录并返回该行。如果今天有一个零的数量并且没有其他未来的日期,我想返回显示为零的行。此表将永远不会有过去的日期,并且所有记录都将包含今天日期的条目。

以下是上述示例数据的理想结果集,考虑到今天是1/23/2014

itemcode    qty_available   date
apple       96              1/27/2014
orange      12              1/23/2014
peach       300             2/5/2014
banana      0               1/23/2014
pineapple   24              1/23/2014

你能帮我解决正确的问题吗?

1 个答案:

答案 0 :(得分:1)

我认为这是你想要获得日期的逻辑:

select itemcode,
       coalesce(min(case when qty_available > 0 then date end), min(date)) as thedate
from timtest tt
where date >= date(now())
group by itemcode;

表达式coalesce(min(case when qty > 0 then date end), min(date))似乎封装了你的逻辑。合并的第一部分返回qty > 0时的第一个日期。如果这些都不存在,那么它会找到0的第一个日期。当今天没有记录时,你没有说明该做什么,但0将来会有记录。这将返回第一个这样的记录。

要获得数量,让我们加入回来:

select tt.*
from timtest tt join
     (select itemcode,
             coalesce(min(case when qty_available > 0 then date end), min(date)) as thedate
      from timtest tt
      where date >= date(now())
      group by itemcode
     ) id
     on tt.itemcode = id.itemcode and tt.date = id.thedate;

编辑:

没有考虑错误的日期格式。以下是此情况的版本:

select tt.*
from timtest tt join
     (select itemcode,
             coalesce(min(case when qty_available > 0 then thedate end), min(thedate)) as thedate
      from (select tt.*, str_to_date(date, '%m/%d/%Y') as thedate
            from timtest tt
           ) tt
      where thedate >= date(now())
      group by itemcode
     ) id
     on tt.itemcode = id.itemcode and str_to_date(tt.date, '%m/%d/%Y') = id.thedate;

对未来的建议:将数据库中的日期存储为日期/日期时间数据时间而不是字符串。如果您商店存储为字符串,请使用YYYY-MM-DD格式,因为您可以使用比较和order by