3

列 1 のレコードが重複しているテーブルからデータを返すクエリがありますが、他の列には異なる値がある可能性があります。正しいレコードを選択する基準を使用して、列 1 の値ごとに 1 つのレコードのみをビューに取り込みたいと考えています。

これがクエリです。

SELECT 
   PrimaryColumn1,
   Column2,
   Column3,
   Date1,
   Date2
FROM
   My_Table

PrimaryColumn1の最新の日付に基づいて作成しているビューに個別の値のみを表示したいと思いますDate1。それが重複している場合は、Date2.

以下のようにしてみましたが、うまくいきませんでした

SELECT 
   PrimaryColumn1,
   Column2,
   Column3,
   Date1,
   Date2
FROM    
   (SELECT  
        [PrimaryColumn1,
        Column2,
        Column3,
        Date1,
        Date2,
        ROW_NUMBER() OVER(PARTITION BY [Date1] ORDER BY Date2) AS RowNumber
    FROM    
        My_Table)
WHERE   
    RowNumber = 1

どんな助けでも大歓迎です。

以下の提案の後、最終的なクエリは次のようになりました。

SELECT 
    PrimaryColumn1,
    Column2, 
    Column3,
    Date1,
    Date2
FROM    
    (SELECT  
         [PrimaryColumn1,
         Column2,
         Column3,
         Date1,
         Date2,
         ROW_NUMBER() OVER(PARTITION BY PrimaryColumn1
                           ORDER BY Date1 DESC, Date2 DESC) AS RowNumber) data
WHERE 
    RowNumber = 1
4

3 に答える 3

1

私はあなたのROW_NUMBER()声明はこのように見えるべきだと思います:

ROW_NUMBER() OVER(PARTITION BY PrimaryColumn1
                      ORDER BY Date1 DESC, Date2 DESC) AS RowNumber

各PrimaryColumn1値の最新のレコードを探しているので、これは(私が理解しているように)必要なことを実行するはずです。

于 2012-12-07T23:02:52.440 に答える
1

CROSS APPLY は、このようなことを行うのに最適な方法です。たとえば、これは Products テーブルの各 CategoryID のレコードを取得し、各カテゴリで最も高価な製品の製品データを表示します。

これにより、結合で相関サブクエリを効果的に使用する方法が得られます。かなりクール。

USE Northwind;
GO
--Get a distinct list of CategoryID values
--From the dbo.Products table, and show the
--Product details for the most expensive product
--in each of those categories....
SELECT DISTINCT 
  Prod.CategoryID,
  TopProd.ProductID,
  TopProd.ProductName,
  TopProd.UnitPrice
FROM dbo.Products AS Prod
CROSS APPLY 
(
  --Find the top 1 product in each category by unitprice
  SELECT TOP 1 
    ProductID,
    ProductName,
    UnitPrice
  FROM dbo.Products
  --This is the "correlated" part where 
  --we filter by the outer queries' CategoryID
  WHERE CategoryID = Prod.CategoryID
  --The ORDER BY determines which product
  --you see for each category.  In this
  --case I'll get the most expensive product
  ORDER BY UnitPrice DESC
) AS TopProd;
于 2012-12-07T23:19:08.907 に答える
0
SELECT 
   PrimaryColumn1,
   Column2,
   Column3,
   Date1,
   Date2
FROM My_Table
INNER JOIN  
   (SELECT  PrimaryColumn1,
        MAX(Date1) AS max_Date1,
        MAX(Date2) AS max_Date2,
        FROM My_Table
        GROUP BY PrimaryColumn1
    ) AS Maxes
ON Maxes.PrimaryColumn1 = My_Table.PrimaryColumn1
AND Maxes.max_Date1 = My_Table.Date1
AND Maxes.max_Date2 = My_Table.Date2
于 2012-12-07T23:07:29.013 に答える