0

最新の日付を選択して名前でグループ化し、他の列を保持しようとしています。

例えば:

        name  status  date
        -----------------------
         a    l       13/19/04
         a    n       13/09/05
         a    dd      13/18/03
         b    l       13/01/01
         b    dd      13/01/02
         b    n       13/01/03

そして、私は次のような結果が欲しい:

        name status date
        -----------------
          a    n      13/09/05
          b    n      13/01/03

これが私のコードです

SELECT
    Name,
    MAX(DATE) as Date,
    Status
FROM
    [ST].[dbo].[PS_RC_STATUS_TBL] 
GROUP BY 
    Name

それぞれの場合に多くの可能性があり、各グループのステータスに選択する値をクエリで明確にするものがないため、 max(status) を配置する必要があることはわかっています。とにかく内部結合を使用することはありますか?

4

5 に答える 5

2

最大または最小のステータスが必要かどうかはわかりません。むしろ、特定の日付での名前とステータスが必要なようです。つまり、各名前の最新の日付を含む行が必要です。だからそれを求めてください:

select * from PS_RC_STATUS_TBL as T
where exists (
      select 1 from PS_RC_STATUS_TBL
      where name = T.name
      group by name
      having max(date) = T.date
)

それについて考える別の方法は、

select T.* 
from PS_RC_STATUS_TBL as T
join (
      select name, max(date)  as date
      from PS_RC_STATUS_TBL
      group by name
) as D
on T.name = D.name
and T.date = D.date
于 2013-05-06T05:47:57.133 に答える
1

SQL Server は、グループ化されていない行をどう処理するかを知る必要があります (1 行に複数の行を表示するため、どうすればよいでしょうか?)。それら(MINMAXAVGなど)を集約した場合、これらの行をどうするかを伝えています。そうでない場合、何をすべきかわからず、あなたが得ているようなエラーが表示されます。

ただし、あなたの言っていることから、ステータスでグループ化したくないようです。あなたはそのコラムにまったく興味がないようですね。その仮定が間違っている場合はお知らせください。

SELECT
    Name,
    MAX(Date) AS 'Date',
FROM
    PS_RC_STATUS_TBL
GROUP BY
    Name

本当にステータスが欲しいが、それをグループ化したくない場合は、これを試してください:

SELECT 
    MyTable1.Name,
    MyTable2.Status,
    MyTable1.Date
FROM
   (SELECT Name, MAX(Date) AS 'Date' FROM PS_RC_STATUS_TBL GROUP BY Name) MyTable1
     INNER JOIN 
   (SELECT Name, Date, Status FROM PS_RC_STATUS_TBL) MyTable2
     ON MyTable1.Name = MyTable2.Name 
    AND MyTable1.Date = MyTable2.Date

これにより、求めた正確な結果が得られます-CTEを使用した以下の方法も同様です。

また

WITH cte AS (
    SELECT Name, MAX(Date) AS Date 
      FROM PS_RC_STATUS_TBL
  GROUP BY Name)

SELECT cte.Name,
       tbl.Status,
       cte.Date
  FROM cte INNER JOIN 
     PS_RC_STATUS_TBL tbl ON cte.Name = tbl.Name 
                         AND cte.Date = tbl.Date

SQLFiddle の例

于 2013-05-05T22:28:20.943 に答える
1

集計されていないすべての列をGROUP BY句に入れる必要があることを意味するだけなので、他の列を入れる必要がある場合

Select  Name , 
        MAX(DATE) as Date ,
        Status
FROM    [ST].[dbo].[PS_RC_STATUS_TBL] PS
Group   by Name, Status
于 2013-04-19T11:40:33.407 に答える
0

集計関数以外のフィールドを選択する場合は、group by 句で言及する必要があります。

SELECT 

gf.app_id,
ma.name as name,
count(ma.name) as count

FROM [dbo].[geo_fen_notification_table]  as gf 
inner join dbo.mobile_applications as ma on gf.app_id = ma.id

GROUP BY app_id,name

ここでは、select で app_id と name にアクセスしているため、group by 句の後に言及する必要があります。そうしないと、エラーがスローされます。

于 2016-03-24T04:03:33.027 に答える