0

SQL Server 2005 を使用した次のデータセットがあります。

TABLE NAME: LOG

TYPE       TIMESTAMP            USERID
Job        26/03/2013 00:24     DED
Job        21/03/2013 02:31     EGA
Sales      NULL                 NULL
Sales      NULL                 NULL

MAX(timestamp) に基づいて、TYPE、TIMESTAMP、および USERID 列を取得したいと思います。つまり、結果は次のようになります。

Job        26/03/2013 00:24     DED

私は次のことを試しました

SELECT max(timestamp), UserID
FROM log
GROUP BY UserID

ただし、すべての行が返されます。

やってみると

SELECT max(timestamp), max(UserID)
FROM log
GROUP BY UserID

それが返す

Job        26/03/2013 00:24     EGA

返される max(userID) は、アルファベット順にソートされた最大列値であることを理解しています。

最後に試してみると

SELECT * 
FROM log 
WHERE timestamp = (SELECTmax(timestamp) FROM log)

結果が得られません(空)。

誰かがそれを助けることができれば、それは大歓迎です!


編集の更新:

その助けがあれば-私は複数のテーブルを持っていることを言及する必要がありSELECTUSERIDWHERE MAX(timestamp)TYPE`を使用する必要があります.

私はこれが完全に機能することを発見しています:

SELECT Type,
       MAX(CASE WHEN log.Type IN ('Job', 'Sales') THEN log.Timestamp ELSE NULL END) As Timestamp,
FROM log

今の問題は、私が試したときです:

SELECT Type,
       MAX(CASE WHEN log.Type IN ('Job', 'Sales') THEN log.Timestamp ELSE NULL END) As Timestamp,
       MAX(CASE WHEN log.Type IN ('Job', 'Sales') THEN log.UserID ELSE NULL END) As UserID,
FROM log

max(timeframe) ではなく、アルファベット順に基づいて max(userID) を取得します。

TYPE = JOB または SALES の場合、MAX(timeframe) と対応する UserID が必要です

(他の多くの列を含む大きな選択クエリの最後に配置します)。


サンプルクエリの更新:

ここに私が実行しようとしているクエリがあります..私の詳細な知識の欠如を非常に残念に思います!

DECLARE @FROMDATE AS DATETIME, @TODATE AS DATETIME;
SET @FROMDATE = '1 Mar 2013'; SET @TODATE = '31 Mar 2013';

SELECT CASE WHEN country.country_code IN (61,64,673,60,65,679,66,62,92,84,63,91) THEN 'APAC'
            WHEN country.country_code IN (81,82,852,853,886) THEN 'EAST ASIA'
            WHEN country.country_code IN (44,353,32,45,358,33,49,30,39,352,356,47,351,34,46,31) THEN 'EUROPE'
            WHEN country.country_code IN (1,101) THEN 'USA/CANADA' ELSE 'OTHER'
       END AS REGION,

       info.Status as STATUS, info.Code as CODE,
       CONVERT(VARCHAR, info.Start_Date,103) as 'START DATE', 

       log.Type AS TYPE,
       MAX(CASE WHEN log.Type IN ('Job','Sales') THEN log.Timestamp ELSE NULL END) As TIMESTAMP,   -- this works fine! :)
       MAX(CASE WHEN log.Type IN ('Job','Sales') THEN log.UserID ELSE NULL END) As USERID  --having trouble with this! :(

FROM log JOIN info ON (log.id = info.id), country

WHERE info.date BETWEEN @FROMDATE AND @TODATE
      AND info.Status NOT LIKE '%NA%'

GROUP BY country.code, info.status, info.code, info.start_date, log.type

皆さんのお役に立てば幸いです。素晴らしいサポートをありがとうございました。これは単純なものだと思いますが、何かが欠けています..

4

2 に答える 2

1

日付列に基づいて、テーブルの最初または最後の行を取得する別の質問に対する私の回答を確認してください: https://stackoverflow.com/a/10111071/452792

あなたが試すことができます :

DECLARE @FROMDATE AS DATETIME, @TODATE AS DATETIME;
SET @FROMDATE = '1 Mar 2013'; SET @TODATE = '31 Mar 2013';

;WITH LOG_CTE AS 
(
  SELECT Stuff(Max(Convert(Varchar, Timestamp, 20) + IsNull(Convert(Varchar, Id), '')), 1, 19, '') As Id
       , Max(Type) As Type
       , Max(timestamp) As Timestamp
       , Stuff(Max(Convert(Varchar, Timestamp, 20) + IsNull(Convert(Varchar, UserID), '')), 1, 19, '') As UserID
    FROM log 
   GROUP BY log.Type 
  HAVING log.Type IN ('JOB','SALES')
)
SELECT CASE WHEN country.country_code IN (61,64,673,60,65,679,66,62,92,84,63,91) THEN 'APAC'
            WHEN country.country_code IN (81,82,852,853,886) THEN 'EAST ASIA'
            WHEN country.country_code IN (44,353,32,45,358,33,49,30,39,352,356,47,351,34,46,31) THEN 'EUROPE'
            WHEN c.country_code IN (1,101) THEN 'USA/CANADA' ELSE 'OTHER'
       END AS REGION,

       info.Status as STATUS, info.Code as CODE,
       CONVERT(VARCHAR, info.Start_Date,103) as 'START DATE', 

       log.Type AS TYPE,
       log.Timestamp,
       log.UserID

FROM LOG_CTE log JOIN info ON (log.id = info.id)

WHERE info.date BETWEEN @FROMDATE AND @TODATE
      AND info.Status NOT LIKE '%NA%'
于 2013-03-26T19:47:14.187 に答える
1

あなたの質問に基づいて、次のサンプル テスト テーブルを作成しました。

CREATE TABLE Log (TYPE VARCHAR(5) NOT NULL, TIMESTAMP DATETIME NULL, USERID VARCHAR(3) NULL);

INSERT INTO Log
VALUES ('Job', '03/26/2013 00:24', 'DED'), ('Job', '03/21/2013 02:31', 'EGA'), ('Sales', NULL, NULL), ('Sales', NULL, NULL);

最後のサンプル クエリを試したところ、正しく機能しました。このクエリはうまくいかなかったので、同じ TIMESTAMP 値を持つ行が複数あるというシナリオを処理する次のように書きました。

WITH BaseData
AS
    (SELECT *
        , ReverseOrder = ROW_NUMBER() OVER
            (ORDER BY TIMESTAMP DESC)
    FROM Log)
SELECT *
FROM BaseData
WHERE ReverseOrder = 1;
于 2013-03-26T18:27:40.067 に答える