1

各グループから上位1つのレコードを選択するためのクエリを作成しています。私はsqlcompact3.5で作業しているため、ランク関数を使用できないことに注意してください。クエリが正しくないことは確かですが、各グループからトップを選択する方法がわかりません。誰かアイデアがありますか?

これが私が機能させようとしていたクエリです

/ * * fH.InvoiceNumberをクエリに追加して、さらに下の結果を取得しました。 /tHを選択します。、t.CustomerNumber、c.CustomerName、fH.Status、fH.InvoiceNumber from tenderHeader tH join task t ON tH.TaskActivityID = t.ActivityID join finalizeTicketHeader fH ON tH.FinalizeTicketTaskActivityID = fH.TaskActivityID join customer c ON t.CustomerNumber = c .CustomerNumber where fH.Status <> '3' AND t.TripID = '08ea6982-6efd-46fa-9753-0fd8b076f24c';

これが私のテーブルの様子です。

customer table:

|------------------------------------------------|
| CustomerNumber | CustomerName | Address1 | ... |
|------------------------------------------------|
| 0012084737     | Customer A   | 150 Rd A | ... |
|------------------------------------------------|
| 0012301891     | Customer B   | 152 Rd A | ... |
|------------------------------------------------|

task table

|-----------------------------------------------------------------|
| ActivityID | TripID    | TaskTypeName | Status | CustomerNumber | 
|-----------------------------------------------------------------|
| 4967f6cc   | 08ea6982  | Payment      | 2      | 0012084737     |
|-----------------------------------------------------------------|
| e96469a1   | 08ea6982  | Payment      | 2      | 0012301891     |
|-----------------------------------------------------------------|

finalizeTicketHeader table

|---------------------------------------------------|
| TaskActivityID | InvoiceNumber | Amount  | Status |
|---------------------------------------------------|
| 916082c8       | 1000          | 563.32  | 3      |
|---------------------------------------------------|
| 916082c8       | 1001          | -343.68 | 0      |
|---------------------------------------------------|
| 4b38bf60       | 1002          | 152.29  | 0      |
|---------------------------------------------------|
| 4b38bf60       | 1003          | -35.80  | 0      |
|---------------------------------------------------|

tenderHeader table

|-------------------------------------------------------------------------------------|
| TaskActivityID | InvoiceNumber | PastDue | TodaysDue | FinalizeTicketTaskActivityID |
|-------------------------------------------------------------------------------------|
| 4967f6cc       | 1234567891    | 23.55   | 219.64    | 916082c8                     |
|-------------------------------------------------------------------------------------|
| e96469a1       | 1234567893    | 0.00    | 116.49    | 4b38bf60                     |
|-------------------------------------------------------------------------------------|

私が抱えていた問題は、重複を取得することでした。

そのようです:

|------------------------------------------------------------------------------------------------------------------------------------|
| TaskActivityID | InvoiceNumber | PastDue | TodaysDue | FinalizeTicketTaskActivityID | CustomerNumber | CustomerName | InvoiceNumber |
|------------------------------------------------------------------------------------------------------------------------------------|
| 4967f6cc       | 1234567891    | 23.55   | 219.64    | 916082c8                     | 0012084737     | Customer A   | 1001         |
|------------------------------------------------------------------------------------------------------------------------------------|
| e96469a1       | 1234567893    | 0.00    | 116.49    | 4b38bf60                     | 0012301891     | Customer B   | 1002         |              
|------------------------------------------------------------------------------------------------------------------------------------|
| e96469a1       | 1234567893    | 0.00    | 116.49    | 4b38bf60                     | 0012301891     | Customer B   | 1003         |
|------------------------------------------------------------------------------------------------------------------------------------|

このようにクエリを書き直しましたが、サブクエリから特定の列を取得する必要があります。

select tH.* from tenderHeader th
inner join task t on tH.TaskActivityID = t.ActivityID
inner join (
    select k.TaskActivityID from finalizeTicketHeader k group by k.TaskActivityID
) as fH on tH.FinalizeTicketTaskActivityID = fH.TaskActivityID
inner join customer c on t.CustomerNumber = c.CustomerNumber

fHからステータスを取得する必要があります。それを行う方法のアイデアはありますか?

select tH.*, fH.Status from tenderHeader th
inner join task t on tH.TaskActivityID = t.ActivityID
inner join finalizeTicketHeader fH on tH.FinalizeTicketTaskActivityID = tH.TaskActivityID
inner join customer c on t.CustomerNumber = c.CustomerNumber
where tH.FinalizeTicketTaskActivityID = (
    select top (1) k.TaskActivityID from finalizeTicketHeader k 
);

しかし、sql Compact 3.5は、whereの原因でサブクエリを使用したスカラー値をサポートしていないようです。

4

1 に答える 1

1

各グループからトップ1を選択する方法を示す例を次に示します。

id|time
--------
2 | 1:10
2 | 0:45 
2 | 1:45
2 | 1:30
1 | 1:00
1 | 1:10

テーブルはtable_1と呼ばれます。IDでグループ化し、時刻はdescorderedであると想定します

 select table_1.* from table_1
 inner join (
     select id, max(time) as max_time from table_1
     group by id
 ) as t
 on t.max_time = table_1.time and table_1.id = t.id
 order by table_1.id

得られる結果は

id|time
--------
1 | 1:10
2 | 1:45
于 2012-06-05T23:37:52.777 に答える