0

私のビューテーブルは次のようなものです:

position price orderid buylog otherlog
1         15   100     08:00  08:01
2         15   100     08:00  08:02
2         15   100     08:00  08:05
2         15   100     08:00  08:02
2         15   101     08:10  08:15
2         15   101     08:10  08:12
2         15   102     08:20  08:25
2         15   103     08:30  08:31
2         15   103     08:30  08:32
2         15   103     08:30  08:33

期待される結果:

position price orderid buylog otherlog
1         15   100     08:00  08:01
2         15   100     08:00  08:05
2         15   101     08:10  08:15
2         15   102     08:20  08:25
2         15   103     08:30  08:33

これは、私が推測するためのほんの一部のステップです。私が実際に望んでいるのは次のとおりです。

position price
1         15 
2         60

そのため、ポジションごとの合計支払いの概要が必要です。

しかし今のところ、私が必要としているのは、すべての位置と順序 ID について、otherlog エントリが最も高い行だけが欲しいということです。

これで、buylog-times よりも低いログ時間が他にもありましたが、単にbuylog < otherlog.

しかし、今では、すべての orderid-group から最高の otherlog だけを正確に表示する方法がわかりません。で試しましmax(otherlog)たが、それでも最初のテーブルが出力されます。

これは 3 つのテーブルを結合した後のビューであり、まったく同じクエリで期待される結果を得たいと考えています。

クエリは次のようになります。

select position,price,orderid,buylog,otherlog 
from table1 inner join table2 on t1.userid=t2.userid  
inner join table3 on t2.id=t2.id 
where (some conditions to narrow down the results)

私はms sqlサーバー2012を使用しています。

//編集

クエリ:

Use [dbname]

go

    with cte
    as  (   select olt.position,
                ot.price,
                ot.orderid,
                ot.buylog = min(ot.buylog) over (partition by olt.position,ot.orderid),
                olt.otherlog = max(olt.otherlog) over (partition by olt.position,ot.orderid),
                rn=row_number() over(partition by olt.position, order by olt.position)
            from ordertable as ot inner join anothertable as at 
                            on ordertable.userid=anothertable.userid

                inner join otherlogtable as olt on anothertable.id=otherlogtable.sessionlogid
        )
    select  
    olt.position,
    ot.price,
    ot.orderid,
    ot.buylog,
    olt.otherlog
    from
    cte
    where
    rn=1

set()派生クラスでオーバーライドしているので、それが によって呼び出されていself.set()ます。

のメソッドを呼び出すにはa、次の構文を使用できます。

    a.set(self, value)
4

2 に答える 2

0

これはうまくいくはずです(ただし、列の起源についてはわかりません):

WITH cte 
     AS (SELECT position, 
                price, 
                orderid, 
                buylog = Min(buylog) 
                          OVER( 
                            partition BY position,orderid), 
                otherlog = Max(otherlog) 
                            OVER( 
                              partition BY position,orderid), 
                rn = Row_number() 
                     OVER( 
                       partition BY position,orderid 
                       ORDER BY position) 
         FROM  T1)
SELECT position, 
       price, 
       orderid, 
       buylog, 
       otherlog 
FROM   cte 
WHERE  rn = 1 

ここにデモがあります

編集編集した質問を考慮して、結合を含む完全なクエリを次に示します。

WITH cte 
     AS (SELECT olt.position, 
                ot.price, 
                ot.orderid, 
                ot.buylog = Min(ot.buylog) 
                              OVER ( 
                                partition BY olt.position, ot.orderid), 
                olt.otherlog = Max(olt.otherlog) 
                                 OVER ( 
                                   partition BY olt.position, ot.orderid), 
                rn=Row_number() 
                     OVER( 
                       partition BY olt.position 
                       ORDER BY olt.position) 
         FROM   ordertable AS ot 
                INNER JOIN anothertable AS at 
                        ON ordertable.userid = anothertable.userid 
                INNER JOIN otherlogtable AS olt 
                        ON anothertable.id = otherlogtable.sessionlogid) 
SELECT position, 
       price, 
       orderid, 
       buylog, 
       otherlog 
FROM   cte 
WHERE  rn = 1 

問題は次のとおりです。

  1. の外側の選択からテーブル名を削除しますCTE(たとえば、のSELECT position代わりにSELECT olt.position
  2. PARTITION BYの部分ROW_NUMBERORDER BY:の間のコンマを削除します。rn=Row_number() OVER( partition BY olt.position ORDER BY olt.position)
于 2013-03-06T09:29:48.757 に答える
0

これを試して:

with cte

as  (   select olt.position,

            ot.price,

            ot.orderid,

            log1 = min(ot.buylog) over (partition by olt.position,ot.orderid),

            log2 = max(olt.otherlog) over (partition by olt.position,ot.orderid),

            rn=row_number() over(partition by olt.position order by olt.position)

        from

            ordertable as ot

            inner join anothertable as at on ordertable.userid=anothertable.userid

            inner join otherlogtable as olt on anothertable.id=otherlogtable.sessionlogid
    )

select   position,  price,   orderid,

log1 ALIASNAME1, log2 ALIASNAME2

from   cte  where  rn=1
于 2013-03-06T11:54:57.113 に答える