2014-10-14 8 views
5

Bài đăng đầu tiên vì vậy hãy làm đẹp. [SQL Server 2014]Trả lại cột bổ sung bằng SELECT (tối đa) T-SQL

Tôi hiện đang chạy một lựa chọn đối với một bảng trông giống như dưới đây

select 
ExerciseCultures.Name, 
max (convert (decimal (10,2), cast(weight as float))) as [Max Weight (KG)] 
from workoutsessions 
     join ExerciseCultures on workoutsessions.ExerciseID 
     = ExerciseCultures.ExerciseID 
group by ExerciseCultures.Name 

nào trả về 31 dòng, một cho mỗi exerciseID cho thấy giá trị 'trọng lượng' cao nhất đối với mỗi người .

Điều tôi cần là cột bổ sung cũng hiển thị ngày cho từng hàng này. Cột ngày đã là một cột trong bảng workoutsessions cùng với mỗi hàng.

Tôi đã thử thêm cột ngày này, bằng cách sử dụng dưới đây:

select 
ExerciseCultures.Name, 
max (convert (decimal (10,2), cast(weight as float))) as [Max Weight (KG)], 
workoutsessions.date 
from workoutsessions 
     join ExerciseCultures on workoutsessions.ExerciseID 
     = ExerciseCultures.ExerciseID 
group by ExerciseCultures.Name, 
    workoutsessions.date 

Nhưng điều này sau đó trả 286 hàng - tất cả các hàng trong bảng cha. Những gì tôi cần là kết quả truy vấn ban đầu chỉ với ngày tương ứng của chúng từ bảng workoutsessions.

Mọi suy nghĩ?

Rất cám ơn

+0

datatype trọng lượng ?, tại sao đầu tiên bạn chuyển đổi nó nổi là gì và sau đó đến thập phân? – Lamak

+0

Làm tốt để hỏi một câu hỏi hợp lý đầu tiên, không nhiều người làm! – Tanner

+0

@Lamak Trọng lượng là varchar, tôi đã gặp khó khăn khi chuyển đổi nó trực tiếp thập phân và đây là một giải pháp được đề nghị. – Adam

Trả lời

1
SELECT A.NAME, 
     A.[max weight (kg)], 
     B.date 
FROM (SELECT exercisecultures.NAME, 
       Max (CONVERT (DECIMAL (10, 2), Cast(weight AS FLOAT))) AS [Max Weight (KG)] 
     FROM workoutsessions 
       JOIN exercisecultures 
       ON workoutsessions.exerciseid = exercisecultures.exerciseid 
     GROUP BY exercisecultures.NAME) A 
     JOIN workoutsessions B 
      ON a.NAME = b.NAME 
      AND CONVERT (DECIMAL (10, 2), Cast(B.weight AS FLOAT)) = 
       A.[max weight (kg)] 
2
;WITH CTE AS 
(
    SELECT e.Name, 
      CONVERT(DECIMAL(10,2),CAST(weight AS FLOAT))) [Max Weight (KG)], 
      w.[date], 
      RN = ROW_NUMBER() OVER(PARTITION BY e.name 
            ORDER BY CONVERT(DECIMAL(10,2),CAST(weight AS FLOAT))) DESC) 
    FROM workoutsessions w 
    INNER JOIN ExerciseCultures e 
     ON w.ExerciseID = e.ExerciseID 
) 
SELECT name, [Max Weight (KG)], [date] 
FROM CTE 
WHERE RN = 1 
1

Với CHÉO ÁP DỤNG

SELECT 
    ExerciseCultures.Name, 
    ws.[weight], 
    ws.[date] 
FROM ExerciseCultures 
    CROSS APPLY (SELECT TOP 1 [weight], [date] 
       FROM workoutsessions 
       WHERE ExerciseCultures.ExerciseID = ExerciseID 
       ORDER BY [weight] desc) ws 
+0

Cần chuyển đổi trọng số thành số đầu tiên. Đặt hàng các chuỗi giữ số và các con số rất khác nhau. –

+0

Xin chào Earl, cảm ơn rất nhiều. Tôi đã không sử dụng chéo áp dụng trước khi như vậy sẽ nhìn vào đó nhiều hơn, nhưng điều này dường như đã thực hiện các trick với một chút tinh chỉnh để chuyển đổi các cột trọng lượng. Mặc dù điều này đã nhấn mạnh rằng việc chuyển đổi từ char sang thập phân rất lộn xộn - sẽ sửa đầu vào cột và thay đổi nó thành một kiểu dữ liệu phù hợp hơn. Cảm ơn nhiều. – Adam

Các vấn đề liên quan