2009-03-20 8 views
0

私はこのような表を持っています。クエリは、各場所の最後の日付エントリを返す必要があります。 SQLとLINQでこれをどのように記述しますか?SQLクエリをLINQに書き込むにはどうすればよいですか?

Id Location  Salary Date 
1 Los Angeles  $1500 Jan-05-1999 
2 San Diego  $250 Jan-07-1999 
3 Los Angeles  $300 Jan-08-1999 
4 Boston   $700 Jan-08-1999 
5 Los Angeles  $300 Jan-08-1999 

結果は次のようになります。

2 San Diego  $250 Jan-07-1999 
4 Boston   $700 Jan-08-1999 
5 Los Angeles  $300 Jan-08-1999 
+0

結果に$額が欲しいですか? –

+0

はい、それだけではnvarcharフィールドだろう –

答えて

0
SELECT location, max(date) 

FROM yourtable 

GROUP BY location 

EDIT:

SELECT yourtable.id, yourtable.location, yourtable.salary, yourtable.date 
FROM yourtable INNER JOIN 
    (SELECT yourtable.location, MAX(yourtable.date) as thedate 
    FROM yourtable 
    GROUP BY yourtable.location) AS MYRESULT 
    on MYRESULT.thedate = yourtable.date 
     AND MYRESULT.location = yourtable.location 

:私はそれが元々あった場合の結果がかわからないために求められて見ませんでしたしかし、これをテストしていない。日の

var collection = from d in <TABLE> select d; 
collection = collection.GroupBy(x => x.Date).Select(x => x.Last()); 

は、基本的にはちょうどグループと最後のいずれかを実行します。

1

は、私がリンクするかなり新たなんだ、と私はこれが最善の方法だとは思わない覚えておいてください。私はLINQコマンドでこれを行う良い方法を考えることができなかったので、私はすべての行を選択しました。誰もがこれらの行を組み合わせることを知っていますか?

+0

はい、あなたは、単にライン2 – leppie

0

@Bobby Shaftoe

私は彼がすべての場所のための最新のエントリではなく、最新の日付を探していたと信じています。私の仮定が正しければ、それは場所ごとに最大日付で行全体を取得するには、より

SELECT max(ID),location,date 
FROM tablename 
GROUP BY location 
+0

まあでTABLEでコレクションを置き換えることができ、彼は日付エントリを述べました。しかし、彼のデータが一貫していれば、おそらく同じことになるだろう。しかし、私は質問に基づいて私が書いたことに固執するが、あなたは正しいかもしれない。 – BobbyShaftoe

+0

ああ、これは間違いです。 DBは、「日付」がgroup by節または集合関数にないと不満を持ちます。 – BobbyShaftoe

+0

彼はここで期待している結果を得ています。それは完全な行です。それはもともとそこにあったかどうかは分かりません。 – Damovisa

0

ようなものだ、私はSQLがあると思う:

SELECT t1.Id, t1.Location, t1.Salary, t1.Date 
FROM YourTable t1, 
    (SELECT Location, MAX(Date) AS MaxDate 
    FROM YourTable 
    GROUP BY Location) t2 
WHERE t1.Location = t2.Location 
AND t1.Date = t2.MaxDate 

私は「なら、私を修正してください私は間違っている!私が正しく、この質問を読んでいる場合

+0

LINQでこれをどのように記述しますか? –

+0

ええ、大きな質問:)短い答えは私は十分にLinqを知らないです。 私はlinqがSQLを幾分ミラーリングする傾向があることを知っていますが、グループ化と結合のための正確な構文(もしあれば)はわかりません。 スティーブ・ウィラードの例に従わなければならないかもしれません。すべてを選択し、式を使ってそれを減らします。 – Damovisa

0

実は、これはそれほど単純ではありません。ロサンゼルスには最大日付に2つのエントリがあるため、その状況では最大IDを選択する必要があるというルールが追加されているようです。その場合、SQLは、もう少し複雑になり、2グループが必要とされている

....

select id, location, salary, date from 
locations where id in 
(select max(id) as MaxID 
from locations where date in (
Select Max(Date) as MaxDate from Locations group by Location) 
Group by location) 

対応するLINQクエリは、また、2グループ...

var qry = from a in locations 
      group a by a.Location into grp 
      from b in grp 
      where b.Date == grp.Max(o => o.Date) 
      group b by b.Location into grp2 
      from c in grp2 
      where c.ID == grp2.Max(obj => obj.ID) 
      orderby c.ID 
      select c; 
1

を必要としますあなたの日付に時間が含まれていれば、次のようになります:

var locations = 
    from l in mycontext.Locations 
    where l.Date = mycontext.Locations 
     .Where(l2=>l.Location == l2.Location) 
     .Max(l2.Date) 
    select l; 

あるいは、IDがアイデンティティであり、th eレコードが発生したときにテーブルに挿入されている場合、次のようにすることができます。

var locations = 
    from l in mycontext.Locations 
    where l.ID = mycontext.Locations 
     .Where(l2=>l.Location == l2.Location) 
     .Max(l2.ID) 
    select l; 
関連する問題