代码之家  ›  专栏  ›  技术社区  ›  AngryHacker

如何在单个语句中执行select?

  •  2
  • AngryHacker  · 技术社区  · 14 年前

    我有一个包含以下数据的SQL Server 2005表:

    idhearing是主键(identity),idcase是可能重复的外键。StartDate和StartTime指定事件的日期和时间-这两个字段都是日期时间类型(无论出于何种原因,它们都是单独的字段)。所有StartDate数据的时间均为12:00:00。所有StartTime数据的日期都是1900年1月1日。isscheduled和isoncalendar是位字段。

    我的挑战是为每一个IDcase选择最新的(日期/时间)听证会。如果开始日期/开始时间相同(如第1行和第2行所示),则应优先选择已计划和/或已启用iscalendar的行。如果这些列也是相同的,那么返回哪一行并不重要。

    要使这变得更复杂,我必须在单select语句中执行所有操作(因为它必须在视图中),并且必须返回您在下面看到的所有列。

    我试过几种方法,但我的SQL-FU不强。有什么想法吗?

    alt text

    idhearing是主键(identity),idcase是可能重复的外键。StartDate和StartTime指定事件的日期和时间-这两个字段都是日期时间类型(无论出于何种原因,它们都是单独的字段)。所有StartDate数据的时间均为12:00:00。所有StartTime数据的日期都是1900年1月1日。isscheduled和isoncalendar是位字段。

    我的挑战是为每一个IDcase选择最新的(日期/时间)听证会。如果开始日期/开始时间相同(如第1行和第2行所示),则应优先选择已计划和/或已启用iscalendar的行。如果这些列也是相同的,那么返回哪一行并不重要。

    要使这变得更复杂,我必须在单个select语句中全部执行(因为它必须在视图中),并且必须返回下面看到的所有列。

    我试过几种方法,但我的SQL-FU不强。有什么想法吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   spender    14 年前

    和OMG小马的答案差不多。排号是你的朋友。我不完全确定位字段是否被视为您想要的,但您知道这一点。和以往一样,最好对您选择的字段进行明确的说明,但我很懒惰。

    create table #table 
    (
        idHearing int,
        idCase int,
        startDate datetime,
        starttime datetime,
        isscheduled bit,
        isoncalendar bit
    );
    insert into #table values(1,1,'8/2/2010','3:30:00 PM',1,1)
    insert into #table values(2,1,'8/2/2010','3:30:00 PM',1,0)
    insert into #table values(3,2,'8/3/2010','5:30:00 PM',1,1)
    insert into #table values(4,2,'8/4/2010','9:30:00 PM',1,1)
    insert into #table values(5,3,'8/2/2010','3:00:00 PM',1,1)
    
    select * from
    (
        select 
            row_number() 
                over 
                (partition by idcase order by 
                    startdate desc,
                    starttime desc,
                    isscheduled desc,
                    isoncalendar desc
                ) idCasePosition,
            * 
        from #table
    ) x
    where idCasePosition=1
    
    drop table #table
    
        2
  •  4
  •   OMG Ponies    14 年前

    用途:

    CREATE VIEW vw_summary AS
    WITH example AS (
        SELECT t.idcase,
               t.startdate,
               t.startime,
               t.isscheduled,
               t.isoncalendar,
               ROW_NUMBER() OVER (PARTITION BY t.idcase ORDER BY t.startdate DESC, 
                                                                 t.starttime DESC, 
                                                                 t.isscheduled DESC,
                                                                 t.isoncalendar DESC) AS rank
          FROM TABLE t)
    SELECT e.*
      FROM example e
     WHERE e.rank = 1
    

    查看-可能会根据行号调整订单…