【问题标题】:SQL Select using distinct and Cast [duplicate]SQL Select 使用 distinct 和 Cast [重复]
【发布时间】:2012-10-09 13:27:30
【问题描述】:

可能重复:
SQL Select DISTINCT using CAST

让我再试一次...我不是 sql 专家,所以请耐心等待我尝试解释这个...我有一个名为 t_recordkeepingleg 的表,其中包含三列数据。 Column1 被命名为LEGTRIPNUMBER,它恰好是一个以字母 Q 开头后跟 4 个数字的字符串。我需要去掉 Q 并将剩余的 4 个字符(数字)转换为整数。到目前为止,每个人都和我在一起吗?此表的 Column2 名为 LEGDATE。 Column3 被命名为LEGGROUP

这是输入场景

LEGTRIPNUMBER    LEGDATE      LEGGROUP
Q1001            08/12/12       0001
Q1001            09/15/12       0002
Q1002            09/01/12       0001
Q1002            09/08/12       0003
Q1002            09/09/12       0002

如您所见,输入表中有LEGTRIPNUMBER 多次出现的行。我只想要第一次出现。

这是我当前的选择语句 - 它有效但返回所有行。

SELECT *, 
   CAST(
       substring("t_RecordkeepingLeg"."LEGTRIPNUMBER",2,4) as INT
   ) as Num_Trip_Num
   FROM   "1669"."dbo"."t_RecordkeepingLeg" "t_RecordkeepingLeg" 
   Where left "t_RecordkeepingLeg"."LEGTRIPNUMBER",1) = 'Q'

我想修改它,使它只选择 Qnnnn 的一次出现。当该行被选中时,我希望LEGDATELEGGROUP 可供我使用。我该怎么做呢?

谢谢,

【问题讨论】:

    标签: sql select casting distinct


    【解决方案1】:

    可以像下面这样简单吗?我刚刚在 leggroup 上添加了条件为 0001

    SELECT *,  
       CAST(substring("t_RecordkeepingLeg"."LEGTRIPNUMBER",2,4) as INT) as Num_Trip_Num 
     FROM   "1669"."dbo"."t_RecordkeepingLeg" "t_RecordkeepingLeg"  
     Where left ("t_RecordkeepingLeg"."LEGTRIPNUMBER",1) = 'Q'
        and "t_RecordkeepingLeg"."LEGGROUP"='0001'
    

    【讨论】:

    • 我不这么认为,因为我不想要所有的 leggroup=0001。我想要第一次出现 LEGTRIPNUMBER 以及 legdate 和 leggroup 中的任何内容。
    • SQL 不保证任何特定的行顺序,因此您的第一次出现可能不是其他人的第一次,这取决于实际的 RDBMS 和其他因素的主机。您能否详细说明上下文,当您说“第一次出现”时是什么意思?是日期最早的那个吗?
    • 如果列 LEGTRIPNUMBER 包含值 Q1001 不止一次,我只想要其中之一。我不在乎哪一个只是其中之一。如果有一列包含唯一但未定义为键的序号怎么办?这对我的情况有帮助吗?
    • 如果你不关心你想要哪一行,那么为什么不使用leggroup=0001 呢? :)
    【解决方案2】:

    如果您的表中有唯一的主键,您可以执行以下操作;

    SELECT CAST(
       substring("t_RecordkeepingLeg"."LEGTRIPNUMBER",2,4) as INT
    ) as Num_Trip_Num
    FROM   "1669"."dbo"."t_RecordkeepingLeg" "t_RecordkeepingLeg" 
    Where "t_RecordkeepingLeg"."ID" In(
       Select Min("t_RecordkeepingLeg"."ID")
       From "1669"."dbo"."t_RecordkeepingLeg" "t_RecordkeepingLeg" 
       Where left ("t_RecordkeepingLeg"."LEGTRIPNUMBER",1) = 'Q'
       Group By "t_RecordkeepingLeg"."LEGTRIPNUMBER"
    )
    

    【讨论】:

    • 抱歉这个骗子帖子。显然这是我的第一篇帖子...不知道如何解释您的回复...
    • 如果你在我的查询中命名为“ID”的表中添加一个唯一的主键,你可以使用我的查询来实现你想要的。
    • 我没有添加密钥的奢侈。
    • 我刚刚检查了一下,似乎我确实有一个名为 LEGID 的唯一主键。看起来很奇怪,因为 LEGID 1 有 LEGTRIPNUMBER Q1001 有,而 LEGID 2 也有 LEGTRIPNUMBER Q1001..???
    • 我认为这解决了我的挑战...谢谢
    【解决方案3】:

    您想要LEGDATELEGGROUP 的哪个 值用于不同的LEGTRIPNUMBER?有多种不明确的可能性,“第一次出现”的概念只有在明确的顺序下才有效。

    例如获取LEGDATE最早的值;

    select Num_Trip_Num, LEGDATE, LEGGROUP from (
        select
           cast(substring(t_RecordkeepingLeg.LEGTRIPNUMBER, 2, 4) as INT) as Num_Trip_Num,
           row_number() over (partition by substring(t_RecordkeepingLeg.LEGTRIPNUMBER, 2, 4) order by t_RecordkeepingLeg.LEGDATE asc) as row,
           t_RecordkeepingLeg.LEGDATE,
           t_RecordkeepingLeg.LEGGROUP
        from t_RecordkeepingLeg
           where left (t_RecordkeepingLeg.LEGTRIPNUMBER, 1) = 'Q'
    ) T
        where row = 1
    

    【讨论】:

    • 从我上面提到的输入中可以看出,Q1001 有 2 行。我只想在该行上查看 LEGDATE 和 LEGGROUP 的第一次出现和相应的数据。在这种情况下,我想要 Q1001 08/12/12 0001。跳过下一行,然后返回 Q1002 的第一次出现以及 09/01/12 0001。
    • 没有“第一次出现”的概念,除非您按某些东西排序,上面的示例假设您想要具有最早 LEGDATE 的行。选择没有 order by 的数据不保证按任何顺序。
    • Select Distinct 有什么作用?我想如果有多行具有相同的列数据,它只会选择其中之一?
    • 选择不同的 a,b,c 将为 a,b,c 的每个唯一组合提供 1 行
    • 哦,我明白了……我正在接受教育……谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2015-03-26
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多