首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择不在子字符串中的唯一值

选择不在子字符串中的唯一值
EN

Stack Overflow用户
提问于 2012-03-29 22:06:19
回答 5查看 198关注 0票数 0

由于某种原因,我不能理解这件事。我正在尝试从一个多列不同的表中获取ID ...基本上就像这样-

代码语言:javascript
运行
复制
Select ID from table where ID in (Select distinct ID, Card, PunchTime, PunchDate)

尽管这显然行不通。我希望获得唯一的I,所有这些字段都是作为标准的。我似乎想不出有效的语法。我不确定我还能说什么,当我看着它的时候,它似乎应该很简单……但是我从昨天开始就开始恢复了,但是什么都不起作用。有人知道我应该走哪条路吗?提前谢谢你!

编辑:发布的东西可以工作,但结果并不是我所期望的。以下是一些saple数据:

代码语言:javascript
运行
复制
ID  Card  PunchDate  PunchTime In/Out
================================
1  00123  3/17/2012  13:00  1
2  00123  3/17/2012  17:00  2
3  00123  3/17/2012  17:00  1
4  00123  3/17/2012  20:00  2
5  00456  3/17/2012  14:00  1
6  00456  3/17/2012  17:00  2

我尝试这样做的原因是,计时软件会判断任何与卡片、打卡日期和打卡时间相同的东西都是重复的,无论它是输入打卡还是输出打卡,并删除一个。我唯一的解决方案是消除重复的,基本上使冲压从第一个进入冲压到最后一个冲压,在那里他们是重复的。因此,我的目标是仅选择基于卡片、穿孔日期和穿孔时间的唯一值。然而,我所拥有的并不排除该事件中的ID,这使得它具有唯一的值。我有一个解决方法,所以时间不是一个特别的问题,但我更愿意弄清楚如何才能获得正确的数据。

再次感谢你们的快速回复!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-29 22:10:30

使用新信息更新了答案:

代码语言:javascript
运行
复制
SELECT *
FROM TABLE
WHERE NOT EXISTS
(
    SELECT 1 
    FROM TABLE AS Duplicates
    WHERE Duplicates.Card = TABLE.Card
        AND Duplicates.PunchDate = TABLE.PunchDate
        AND Duplicates.PunchTime = TABLE.PunchTime
        AND Duplicates.ID != TABLE.ID
)

基本上,这就是说,获取所有不具有相同card, punchdate, punchtime的记录(确保不将相同的行计算在内)。

票数 2
EN

Stack Overflow用户

发布于 2012-03-29 23:00:29

假设没有从一天开始到第二天结束的第二班。

表:

代码语言:javascript
运行
复制
DECLARE @table TABLE
    (
      [ID] INT IDENTITY,
      [Card] INT,
      [PunchDate] DATETIME,
      [PunchTime] DATETIME,
      [In/Out] TINYINT
    )
INSERT  INTO @table
        (
          [Card],
          [PunchDate],
          [PunchTime],
          [In/Out]
        )
        SELECT  00123,
                '3/17/2012',
                '3/17/2012 13:00',
                1
        UNION ALL
        SELECT  00123,
                '3/17/2012',
                '3/17/2012 17:00',
                2
        UNION ALL
        SELECT  00123,
                '3/17/2012',
                '3/17/2012 17:00',
                1
        UNION ALL
        SELECT  00123,
                '3/17/2012',
                '3/17/2012 20:00',
                2
        UNION ALL
        SELECT  00456,
                '3/17/2012',
                '3/17/2012 14:00',
                1
        UNION ALL
        SELECT  00456,
                '3/17/2012',
                '3/17/2012 17:00',
                2

查询:

代码语言:javascript
运行
复制
SELECT  [Card],
        [PunchDate],
        MIN([PunchTime]) [PunchTime],
        [In/Out]
FROM    @table
WHERE   [In/Out] = 1
GROUP BY [Card],
        [PunchDate],
        [In/Out]
UNION
SELECT  [Card],
        [PunchDate],
        MAX([PunchTime]) [PunchTime],
        [In/Out]
FROM    @table
WHERE   [In/Out] = 2
GROUP BY [Card],
        [PunchDate],
        [In/Out]
ORDER BY [Card],
        [PunchDate]

结果:

代码语言:javascript
运行
复制
Card    PunchDate   PunchTime   In/Out
123 2012-03-17 00:00:00.000 2012-03-17 13:00:00.000 1
123 2012-03-17 00:00:00.000 2012-03-17 20:00:00.000 2
456 2012-03-17 00:00:00.000 2012-03-17 14:00:00.000 1
456 2012-03-17 00:00:00.000 2012-03-17 17:00:00.000 2

下一步,他会想要这个:

代码语言:javascript
运行
复制
SELECT  a.[Card],
        a.[PunchDate],
        a.[PunchTime],
        b.[PunchTime],
        DATEDIFF(hour, a.[PunchTime], b.[PunchTime]) TotalTime
FROM    (
          SELECT    [Card],
                    [PunchDate],
                    MIN([PunchTime]) [PunchTime]
          FROM      @table
          WHERE     [In/Out] = 1
          GROUP BY  [Card],
                    [PunchDate]
        ) a
        INNER JOIN (
                     SELECT [Card],
                            [PunchDate],
                            MAX([PunchTime]) [PunchTime]
                     FROM   @table
                     WHERE  [In/Out] = 2
                     GROUP BY [Card],
                            [PunchDate]
                   ) b
            ON a.[Card] = b.[Card]
               AND a.[PunchDate] = b.[PunchDate]
ORDER BY a.[Card],
        a.[PunchDate]

结果

代码语言:javascript
运行
复制
Card    PunchDate   PunchTime   PunchTime                   TotalTime
123 2012-03-17 00:00:00.000 2012-03-17 13:00:00.000 2012-03-17 20:00:00.000 7
456 2012-03-17 00:00:00.000 2012-03-17 14:00:00.000 2012-03-17 17:00:00.000 3
票数 2
EN

Stack Overflow用户

发布于 2012-03-29 22:35:36

代码语言:javascript
运行
复制
Select
  *
FROM
  table
WHERE
  NOT EXISTS (
    SELECT
      *
    FROM
      table AS lookup
    WHERE
          ID       <> table.ID
      AND Card      = table.Card
      AND PunchTime = table.PunchTime
      AND PunchDate = table.PunchDate
  )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9927048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档