13

私は以下のようなテーブルを持っています:

MyJob|   MyKey  |MyCode|MyDate| MyTime 
----------------------------------       
q183b| 0131081a |  24  |100315| 9:37        
q183b| 0131081a |  9   |100315| 11:38        
q183b| 0132426a |  1   |90314 | 15:36        
q183b| 0132426a |  2   |100315| 9:36        
q183b| 0132426a |  85  |100315| 11:36

MyDate の形式は YYMMDD で、MyTime は 24 時間形式であることに注意してください。

最新の MyDate と MyTime を使用して、一意の MyKey の結果を返したいと考えています。期待される結果は次のようになります。

MyJob |   MyKey  |MyCode| MyDate | MyTime        
q183b | 0131081a | 9    | 100315 | 11:38        
q183b | 0132426a | 85   | 100315 | 11:36

どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

12

最初に、日付と時刻の列を結合して datetime にすることで、並べ替えが簡単になります。Sql Server を使用してからしばらく経ちましたが、row_number() 関数とパーティショニングを使用すると、別の列でグループ化された列の最大値を簡単に見つけることができます。partition 句は group by に似ています。

select t.* 
from
(
    select t.MyKey, t.MyDateTime
    , row_number() over 
         (partition by t.mykey order by t.MyDateTime desc) as keyOrderNbr
    from table t
) A
inner join table t
    on A.MyKey = t.MyKey 
    and A.MyDateTime = t.MyDateTime
where A.keyOrderNbr = 1
于 2013-08-23T01:24:26.640 に答える
2

まず、日付文字を日付フィールドに変換して、それで注文できるようにする必要があります。次に、できることは次のとおりです。

SELECT DISTINCT *
FROM MyTable
WHERE MyTable.MyDate =
(
    SELECT MAX(Sub_MyTable.MyDate)
    FROM MyTable 
    WHERE MyTable.MyKey = Sub_MyTable.MyKey
);

ここで、フィールドを日付フィールドに変換しない限り、MAX(MyDate) および MyDate へのその他の参照は必要なことを実行しないことに注意してください。char フィールドを日付フィールドに変換する独自の関数を作成することをお勧めします。

そのまま MyDate フィールドで並べ替えようとすると、文字列なのでアルファベット順に並べ替えられます。

結果で時間部分が重要な場合は、@ jeff の提案に従って 2 つを組み合わせることができます。

于 2013-08-23T01:33:49.197 に答える